"""
PM Module — Kanban Domain Entities

موجودیت‌های کانبان — برچسب، پیوست، چک‌لیست، RACI.
"""

from dataclasses import dataclass, field
from datetime import date, datetime
from typing import Optional
from uuid import UUID, uuid4

from shared.base_classes.entity import TenantEntity


# ═══════════════════════════════════════════════════
# Task Label
# ═══════════════════════════════════════════════════

@dataclass
class TaskLabel(TenantEntity):
    """برچسب رنگی تسک."""

    project_id: UUID = field(default_factory=uuid4)
    name: str = ""
    color: str = "#3B82F6"
    description: str = ""
    sort_order: int = 0


@dataclass
class TaskLabelAssignment(TenantEntity):
    """ارتباط بین تسک و برچسب."""

    task_id: UUID = field(default_factory=uuid4)
    label_id: UUID = field(default_factory=uuid4)


# ═══════════════════════════════════════════════════
# Task Attachment
# ═══════════════════════════════════════════════════

@dataclass
class TaskAttachment(TenantEntity):
    """پیوست فایل به تسک."""

    task_id: UUID = field(default_factory=uuid4)
    file_name: str = ""
    file_url: str = ""
    file_size: int = 0
    mime_type: str = ""
    uploaded_by: Optional[UUID] = None


# ═══════════════════════════════════════════════════
# Task Checklist
# ═══════════════════════════════════════════════════

@dataclass
class TaskChecklist(TenantEntity):
    """چک‌لیست تسک."""

    task_id: UUID = field(default_factory=uuid4)
    title: str = ""
    sort_order: int = 0


@dataclass
class TaskChecklistItem(TenantEntity):
    """آیتم چک‌لیست."""

    checklist_id: UUID = field(default_factory=uuid4)
    title: str = ""
    is_checked: bool = False
    assignee_id: Optional[UUID] = None
    due_date: Optional[date] = None
    sort_order: int = 0


# ═══════════════════════════════════════════════════
# RACI Assignment
# ═══════════════════════════════════════════════════

@dataclass
class RACIAssignment(TenantEntity):
    """اختصاص نقش RACI در سطح پروژه یا تسک."""

    project_id: UUID = field(default_factory=uuid4)
    task_id: Optional[UUID] = None
    user_id: Optional[UUID] = None
    resource_id: Optional[UUID] = None
    role: str = ""  # R, A, C, I
    notes: str = ""
