
import uuid
from sqlalchemy import Column, DateTime, ForeignKey, Integer, String, Boolean,Enum,Date, Text
from sqlalchemy.ext.declarative import declarative_base
from uuid import uuid4  
from database import Base
from pydantic import BaseModel, EmailStr
from datetime import date, datetime
from sqlalchemy.orm import relationship
Base = declarative_base()

class SubTaskMale(Base):
    __tablename__ = "sub_task_male"

    id_sub_task = Column(String(36), primary_key=True, index=True, default=lambda: str(uuid4()))  # UUID
    name_subtask = Column(String(1000), nullable=False)
    hukum = Column(String(50), nullable=False)
    task_image = Column(String(255), nullable=False)
    status = Column(Boolean, default=False)  # Matches default in SQL
    info = Column(String(255), nullable=True)
    video_path = Column(String(255), nullable=True)
    id_main_task = Column(String(50), nullable=False)
    no_task = Column(String(10), nullable=False)

class SubTaskFemale(Base):
    __tablename__ = "sub_task_female"

    id_sub_task = Column(String(36), primary_key=True, index=True, default=lambda: str(uuid4()))  # UUID
    name_subtask = Column(String(1000), nullable=False)
    hukum = Column(String(50), nullable=False)
    task_image = Column(String(255), nullable=False)
    status = Column(Boolean, default=False)  # Matches default in SQL
    info = Column(String(255), nullable=True)
    video_path = Column(String(255), nullable=True)
    id_main_task = Column(String(50), nullable=False)
    no_task = Column(String(10), nullable=False)

class MainTask(Base):
    __tablename__ = "main_task"

    id_main_task = Column(String(100), primary_key=True, nullable=False)
    name_task = Column(String(100), nullable=False)
    status = Column(Integer, nullable=False, default=0)

    

class SessionUmrah(Base):
    __tablename__ = "session_umrah"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid4()))  # UUID for unique session ID
    id_user = Column(String(36), ForeignKey("users.id"), nullable=False)  # Reference to User table
    status = Column(String(20), default="ongoing")  
    start_session = Column(Date, nullable=False)  # ? Changed to Date (not DateTime)
    finish_session = Column(Date, nullable=True) 


    # Relationship with session_umrah_task
    user = relationship("User", back_populates="sessions")  # ? Added
    umrah_records = relationship("Umrah", back_populates="session")  # ? Added

    #tasks = relationship("SessionUmrahTask", back_populates="session", cascade="all, delete-orphan")  # Optional


class Umrah(Base):
    __tablename__ = "umrah"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid4()))
    id_session = Column(String(36), ForeignKey("session_umrah.id"), nullable=False)  # ? Corrected column name
    umrah_start = Column(Date, nullable=False)  # ? Changed to Date (not DateTime)
    umrah_finish = Column(Date, nullable=True)  # ? Changed to Date (not DateTime)
    status = Column(Enum("incomplete", "complete", name="umrah_status"), default="incomplete")
    miqat = Column(String(100), nullable=False)

    # ? Relationship with SessionUmrah
    session = relationship("SessionUmrah", back_populates="umrah_records")
    tasks = relationship("UmrahTask", back_populates="umrah")

class QuizUmrah(Base):
    __tablename__ = "kuiz_umrah"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    kategori = Column(String(250))
    no_soalan = Column(Integer)
    pernyataan = Column(Text)
    jawapan = Column(String(10))

class QuizQuestion(BaseModel):
    id: str
    kategori: str
    no_soalan: int | None = None
    pernyataan: str
    jawapan: str

    class Config:
        orm_mode = True


class UmrahTask(Base):
    __tablename__ = "umrah_task"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid4()))
    umrah_id = Column(String(36), ForeignKey("umrah.id"), nullable=False)
    task_id = Column(String(36), nullable=False)
    status = Column(Enum('incomplete', 'completed'), default="incomplete")
    calculate= Column(Enum('true', 'false'), default="false")
    # ? Correct relationship: Many UmrahTasks belong to one Umrah
    umrah = relationship("Umrah", back_populates="tasks")
    #task = relationship("MainTask", back_populates="umrah_tasks")

class UserCreate(BaseModel):
    name: str
    email: EmailStr
    password: str
    date_birth: date
    gender: str
    country: str
    phone_number: str | None = None


class User(Base):
    __tablename__ = "users"

    id = Column(String(36), primary_key=True, index=True, default=lambda: str(uuid4()))
    name = Column(String(100), nullable=False)
    email = Column(String(100), unique=True, nullable=False, index=True)
    password = Column(String(255), nullable=False)
    date_birth = Column(Date, nullable=False)
    gender = Column(Enum('male', 'female'), nullable=False)
    country = Column(String(100), nullable=False)
    phone_number = Column(String(20), nullable=True)

    sessions = relationship("SessionUmrah", back_populates="user")
    def __repr__(self):
        return f"<User(email={self.email}, name={self.name})>"



class UserLogin(BaseModel):
    email: str
    password: str


class MiqatSubmission(BaseModel):
    id: str
    miqat: str


class UserResponse(BaseModel):
    id: str
    name: str
    email: str
    date_birth: date
    gender: str
    country: str
    phone_number: str | None

    class Config:
        from_attributes = True  # ? Use this instead of `orm_mode`
