from sqlalchemy import (
    Column,
    String,
    Enum as SQLEnum,
    ForeignKey,
    DateTime
)

import enum

from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship

from utils.db_connect import BaseModelForTable


class OrganizationRole(str, enum.Enum):
    MANAGER = "MANAGER"
    MEMBER = "MEMBER"


class InviteStatus(str, enum.Enum):
    PENDING = "PENDING"
    ACCEPTED = "ACCEPTED"
    REJECTED = "REJECTED"
    EXPIRED = "EXPIRED"


class OrganizationUserInvite(BaseModelForTable):
    __tablename__ = "organization_user_invites"

    org_id = Column(
        UUID(as_uuid=True),
        ForeignKey("organizations.id", ondelete="CASCADE"),
        nullable=False
    )

    email = Column(
        String,
        nullable=False,
        index=True
    )

    token = Column(
        String(256),
        nullable=False,
        unique=True
    )

    org_role = Column(
        SQLEnum(
            OrganizationRole,
            name="organization_role"
        ),
        default=OrganizationRole.MEMBER,
        nullable=False
    )

    invited_by = Column(
        UUID(as_uuid=True),
        ForeignKey("users.id", ondelete="CASCADE"),
        nullable=False
    )

    status = Column(
        SQLEnum(
            InviteStatus,
            name="invite_status"
        ),
        default=InviteStatus.PENDING,
        nullable=False
    )

    expires_at = Column(
        DateTime,
        nullable=False
    )

    # Relationships

    organization = relationship(
        "Organization",
        back_populates="invites"
    )

    inviter = relationship(
        "User",
        back_populates="sent_invites"
    )