"""مدل‌های بخش «کارها» (تسک‌بورد شبیه تیک‌تیک): پوشه، تسک و زیرتسک.

قرارداد تاریخ‌ها مثل بقیه‌ی پروژه:
- due_date یک روز تقویم ایران است (db.Date) و مستقیم با iran_today() مقایسه می‌شه.
- ستون‌های زمانی (created_at/done_at) به UTC ذخیره می‌شن؛ done_at با jalali.utc_now() نوشته می‌شه.

کلید خارجی SQLite خاموشه، پس ondelete فقط تزئینیه و پاک‌سازی فرزندها با cascade خود ORM انجام می‌شه
(یعنی حذف حتماً باید با db.session.delete(...) باشه، نه query.delete()).
"""
from app.extensions import db


class TaskFolder(db.Model):
    __tablename__ = "task_folders"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(120), nullable=False)
    color = db.Column(db.String(20), nullable=False, default="gold")  # کلید توکن رنگ در variables.css
    is_archived = db.Column(db.Boolean, nullable=False, default=False)
    created_by = db.Column(db.Integer, db.ForeignKey("users.id"))
    created_at = db.Column(db.DateTime, nullable=False, server_default=db.func.now())

    items = db.relationship("TaskItem", back_populates="folder", cascade="all, delete-orphan")

    __table_args__ = (db.UniqueConstraint("name", name="uq_task_folder_name"),)


class TaskItem(db.Model):
    __tablename__ = "task_items"

    id = db.Column(db.Integer, primary_key=True)
    folder_id = db.Column(db.Integer, db.ForeignKey("task_folders.id", ondelete="CASCADE"), nullable=False)
    title = db.Column(db.String(300), nullable=False)
    customer_id = db.Column(db.Integer, db.ForeignKey("customers.id", ondelete="SET NULL"))
    assignee_id = db.Column(db.Integer, db.ForeignKey("users.id"))
    due_date = db.Column(db.Date)  # روز تقویم ایران
    due_time = db.Column(db.Time)  # ساعت سررسید (اختیاری)
    priority = db.Column(db.Integer, nullable=False, default=0)  # ۰ بدون اولویت ... ۳ اولویت بالا
    repeat_rule = db.Column(db.String(20))  # daily | weekly | monthly | quarterly | yearly
    notes = db.Column(db.Text)
    is_done = db.Column(db.Boolean, nullable=False, default=False)
    done_at = db.Column(db.DateTime)  # UTC
    done_by = db.Column(db.Integer, db.ForeignKey("users.id"))
    created_by = db.Column(db.Integer, db.ForeignKey("users.id"))
    created_at = db.Column(db.DateTime, nullable=False, server_default=db.func.now())

    folder = db.relationship("TaskFolder", back_populates="items")
    customer = db.relationship("Customer")
    assignee = db.relationship("User", foreign_keys=[assignee_id])
    completer = db.relationship("User", foreign_keys=[done_by])
    subtasks = db.relationship(
        "TaskSubitem", cascade="all, delete-orphan", lazy="selectin", order_by="TaskSubitem.id"
    )

    __table_args__ = (
        db.Index("idx_task_items_folder", "folder_id", "is_done"),
        db.Index("idx_task_items_due", "is_done", "due_date"),
    )


class TaskSubitem(db.Model):
    __tablename__ = "task_subitems"

    id = db.Column(db.Integer, primary_key=True)
    task_id = db.Column(db.Integer, db.ForeignKey("task_items.id", ondelete="CASCADE"), nullable=False)
    title = db.Column(db.String(300), nullable=False)
    is_done = db.Column(db.Boolean, nullable=False, default=False)

    __table_args__ = (db.Index("idx_task_subitems_task", "task_id"),)
