from sqlalchemy import Column, String, Boolean, Index, Enum, LargeBinary
from sqlalchemy.dialects.mysql import INTEGER, VARCHAR, TINYINT, BIGINT, BLOB
from sqlalchemy.orm import relationship
from app.db.base_class import Base


class User(Base):
    __tablename__ = "users"

    user_id = Column(INTEGER, primary_key=True, autoincrement=True)

    signup_type = Column(INTEGER, nullable=False,default=0)  # 1-Google, 2-Apple, 3-Facebook
    social_id = Column(VARCHAR(255), nullable=True, index=True)
    google_id = Column(VARCHAR(255), nullable=True)
    apple_id = Column(VARCHAR(255), nullable=True)
    timezone = Column(VARCHAR(255), nullable=True)
    auth_key = Column(VARCHAR(255), nullable=True)

    firstname = Column(VARCHAR(255), nullable=False, default="")
    lastname = Column(VARCHAR(255), nullable=False, default="")
    fullname = Column(VARCHAR(255), nullable=True, default="")

    email = Column(VARCHAR(255), nullable=True, index=True)
    password = Column(VARCHAR(255), nullable=False)

    profilepic = Column(VARCHAR(255), nullable=True)
    is_profile_completed = Column(TINYINT(1), nullable=False, default=0)
    is_deleted = Column(Boolean, default=0)

    created_ipaddress = Column(VARCHAR(255), nullable=True)
    updated_ipaddress = Column(VARCHAR(255), nullable=True)

    created_at = Column(BIGINT, nullable=False)
    updated_at = Column(BIGINT, nullable=False)

    apple_auth_code = Column(VARCHAR(255), nullable=True)
    access_token = Column(VARCHAR(255), nullable=True)
    refresh_token = Column(VARCHAR(255), nullable=True)
    apple_access_token_generated_at = Column(
        # TIMESTAMP NULL in dump; keep as VARCHAR/NULL-safe if you prefer string storage
        # or use sqlalchemy.TIMESTAMP with nullable=True if your DB timezone settings are fine.
        # Here we’ll keep as nullable timestamp using string column for safety across MySQL variants.
        VARCHAR(255),
        nullable=True,
    )
    apple_access_token_expired_at = Column(VARCHAR(255), nullable=True)

    is_new = Column(BIGINT, nullable=False, default=1)  # 1-New | 0-Old (as per dump)
    is_new_user = Column(TINYINT(1), nullable=False, default=1)
    is_deleted = Column(TINYINT(1), nullable=False, default=0)  # 0-Active | 1-Deleted (as per dump)

    # Relationships
    histories = relationship("GeneratedTattooHistory", back_populates="user", cascade="all, delete-orphan")
    user_device_logins = relationship("UserDeviceLogin", back_populates="user",cascade="all, delete-orphan")

    def __repr__(self) -> str:
        return f"<User id={self.user_id} email={self.email}>"
