"""
PM Module — Settings Schema Registration

تعریف و ثبت schema تنظیمات ماژول مدیریت پروژه.
هنگام بارگذاری ماژول (AppConfig.ready) این فایل ایمپورت می‌شود.
"""
from apps.core.module_settings.domain import (
    SettingsFieldDefinition,
    SettingsSchemaDefinition,
    SettingsSectionDefinition,
)
from apps.core.module_settings.schema_registry import settings_schema_registry


# ─── General Section ──────────────────────────────────────────

general_section = SettingsSectionDefinition(
    key="general",
    label="تنظیمات عمومی",
    label_en="General Settings",
    description="تنظیمات عمومی ماژول مدیریت پروژه",
    icon="HiOutlineCog6Tooth",
    order=1,
    fields=(
        SettingsFieldDefinition(
            key="default_currency",
            field_type="str",
            label="واحد پول پیش‌فرض",
            label_en="Default Currency",
            default_value="IRR",
        ),
        SettingsFieldDefinition(
            key="auto_generate_project_code",
            field_type="bool",
            label="تولید خودکار کد پروژه",
            label_en="Auto-generate Project Code",
            default_value=True,
        ),
        SettingsFieldDefinition(
            key="project_code_prefix",
            field_type="str",
            label="پیشوند کد پروژه",
            label_en="Project Code Prefix",
            default_value="PRJ",
        ),
        SettingsFieldDefinition(
            key="default_project_type",
            field_type="select",
            label="نوع پیش‌فرض پروژه",
            label_en="Default Project Type",
            default_value="project",
            options=(
                ("portfolio", "سبد پروژه"),
                ("program", "برنامه"),
                ("project", "پروژه"),
                ("sub_project", "زیرپروژه"),
            ),
        ),
        SettingsFieldDefinition(
            key="fiscal_year_start_month",
            field_type="int",
            label="ماه شروع سال مالی",
            label_en="Fiscal Year Start Month",
            default_value=1,
            min_value=1,
            max_value=12,
            description="ماه شروع سال مالی برای گزارش‌دهی بودجه",
        ),
    ),
)


# ─── Scheduling Section ──────────────────────────────────────

scheduling_section = SettingsSectionDefinition(
    key="scheduling",
    label="تنظیمات زمان‌بندی",
    label_en="Scheduling Settings",
    description="تنظیمات زمان‌بندی و تقویم پروژه",
    icon="HiOutlineCalendarDays",
    order=2,
    fields=(
        SettingsFieldDefinition(
            key="working_hours_per_day",
            field_type="int",
            label="ساعات کاری روزانه",
            label_en="Working Hours per Day",
            default_value=8,
            min_value=1,
            max_value=24,
        ),
        SettingsFieldDefinition(
            key="working_days_per_week",
            field_type="int",
            label="روزهای کاری هفته",
            label_en="Working Days per Week",
            default_value=6,
            min_value=1,
            max_value=7,
        ),
        SettingsFieldDefinition(
            key="default_task_duration_days",
            field_type="int",
            label="مدت پیش‌فرض تسک (روز)",
            label_en="Default Task Duration (Days)",
            default_value=5,
            min_value=1,
            max_value=365,
        ),
        SettingsFieldDefinition(
            key="enable_critical_path",
            field_type="bool",
            label="نمایش مسیر بحرانی",
            label_en="Enable Critical Path Highlighting",
            default_value=True,
        ),
        SettingsFieldDefinition(
            key="auto_schedule",
            field_type="bool",
            label="زمان‌بندی خودکار",
            label_en="Auto Schedule on Dependency Change",
            default_value=True,
            description="محاسبه خودکار مسیر بحرانی هنگام تغییر وابستگی‌ها",
        ),
        SettingsFieldDefinition(
            key="weekend_days",
            field_type="multi_select",
            label="روزهای تعطیل هفته",
            label_en="Weekend Days",
            default_value=["friday"],
            options=(
                ("saturday", "شنبه"),
                ("sunday", "یکشنبه"),
                ("monday", "دوشنبه"),
                ("tuesday", "سه‌شنبه"),
                ("wednesday", "چهارشنبه"),
                ("thursday", "پنجشنبه"),
                ("friday", "جمعه"),
            ),
        ),
    ),
)


# ─── Cost Section ─────────────────────────────────────────────

cost_section = SettingsSectionDefinition(
    key="cost",
    label="تنظیمات هزینه و بودجه",
    label_en="Cost & Budget Settings",
    description="تنظیمات مدیریت هزینه و بودجه پروژه",
    icon="HiOutlineBanknotes",
    order=3,
    fields=(
        SettingsFieldDefinition(
            key="enable_evm",
            field_type="bool",
            label="فعال‌سازی EVM",
            label_en="Enable Earned Value Management",
            default_value=True,
            description="فعال‌سازی مدیریت ارزش کسب‌شده (PV, EV, AC, CPI, SPI)",
        ),
        SettingsFieldDefinition(
            key="budget_warning_threshold",
            field_type="float",
            label="آستانه هشدار بودجه (%)",
            label_en="Budget Warning Threshold (%)",
            default_value=80.0,
            min_value=50.0,
            max_value=100.0,
            description="درصدی از بودجه که پس از رسیدن به آن هشدار داده می‌شود",
        ),
        SettingsFieldDefinition(
            key="budget_critical_threshold",
            field_type="float",
            label="آستانه بحرانی بودجه (%)",
            label_en="Budget Critical Threshold (%)",
            default_value=95.0,
            min_value=80.0,
            max_value=100.0,
        ),
        SettingsFieldDefinition(
            key="allow_over_budget",
            field_type="bool",
            label="اجازه هزینه بیش از بودجه",
            label_en="Allow Over-Budget Spending",
            default_value=False,
        ),
        SettingsFieldDefinition(
            key="cost_rate_type",
            field_type="select",
            label="نوع نرخ هزینه پیش‌فرض",
            label_en="Default Cost Rate Type",
            default_value="hourly",
            options=(
                ("hourly", "ساعتی"),
                ("daily", "روزانه"),
                ("fixed", "ثابت"),
            ),
        ),
    ),
)


# ─── Resource Section ─────────────────────────────────────────

resource_section = SettingsSectionDefinition(
    key="resource",
    label="تنظیمات منابع",
    label_en="Resource Settings",
    description="تنظیمات مدیریت منابع پروژه",
    icon="HiOutlineUserGroup",
    order=4,
    fields=(
        SettingsFieldDefinition(
            key="max_resource_allocation",
            field_type="float",
            label="حداکثر تخصیص منبع (%)",
            label_en="Max Resource Allocation (%)",
            default_value=100.0,
            min_value=50.0,
            max_value=200.0,
            description="حداکثر درصد تخصیص مجاز برای یک منبع",
        ),
        SettingsFieldDefinition(
            key="enable_resource_leveling",
            field_type="bool",
            label="تسطیح منابع",
            label_en="Enable Resource Leveling",
            default_value=False,
        ),
        SettingsFieldDefinition(
            key="enable_timesheet",
            field_type="bool",
            label="فعال‌سازی تایم‌شیت",
            label_en="Enable Timesheet",
            default_value=True,
        ),
        SettingsFieldDefinition(
            key="timesheet_approval_required",
            field_type="bool",
            label="نیاز به تأیید تایم‌شیت",
            label_en="Timesheet Approval Required",
            default_value=True,
        ),
    ),
)


# ─── Risk Section ──────────────────────────────────────────────

risk_section = SettingsSectionDefinition(
    key="risk",
    label="تنظیمات ریسک",
    label_en="Risk Settings",
    description="تنظیمات مدیریت ریسک پروژه",
    icon="HiOutlineShieldExclamation",
    order=5,
    fields=(
        SettingsFieldDefinition(
            key="risk_matrix_size",
            field_type="select",
            label="اندازه ماتریس ریسک",
            label_en="Risk Matrix Size",
            default_value="5x5",
            options=(
                ("3x3", "۳×۳"),
                ("5x5", "۵×۵"),
            ),
        ),
        SettingsFieldDefinition(
            key="high_risk_threshold",
            field_type="float",
            label="آستانه ریسک بالا",
            label_en="High Risk Threshold",
            default_value=0.6,
            min_value=0.1,
            max_value=1.0,
            description="امتیازی که بالاتر از آن ریسک «بالا» محسوب می‌شود",
        ),
        SettingsFieldDefinition(
            key="auto_notify_high_risks",
            field_type="bool",
            label="اطلاع‌رسانی خودکار ریسک بالا",
            label_en="Auto-notify High Risks",
            default_value=True,
        ),
    ),
)


# ─── Baseline Section ─────────────────────────────────────────

baseline_section = SettingsSectionDefinition(
    key="baseline",
    label="تنظیمات خط پایه",
    label_en="Baseline Settings",
    description="تنظیمات مدیریت خط پایه پروژه",
    icon="HiOutlineBookmark",
    order=6,
    fields=(
        SettingsFieldDefinition(
            key="max_baselines_per_project",
            field_type="int",
            label="حداکثر خطوط پایه",
            label_en="Max Baselines per Project",
            default_value=10,
            min_value=1,
            max_value=50,
        ),
        SettingsFieldDefinition(
            key="require_approval_for_baseline",
            field_type="bool",
            label="نیاز به تأیید برای ایجاد خط پایه",
            label_en="Require Approval for Baseline Creation",
            default_value=False,
        ),
    ),
)


# ─── Change Request Section ───────────────────────────────────

change_request_section = SettingsSectionDefinition(
    key="change_request",
    label="تنظیمات درخواست تغییر",
    label_en="Change Request Settings",
    description="تنظیمات مدیریت درخواست‌های تغییر",
    icon="HiOutlineDocumentCheck",
    order=7,
    fields=(
        SettingsFieldDefinition(
            key="require_workflow_approval",
            field_type="bool",
            label="نیاز به فرآیند تأیید",
            label_en="Require Workflow Approval",
            default_value=True,
            description="فعال‌سازی فرآیند تأیید از طریق Workflow Engine",
        ),
        SettingsFieldDefinition(
            key="auto_generate_cr_code",
            field_type="bool",
            label="تولید خودکار کد درخواست تغییر",
            label_en="Auto-generate CR Code",
            default_value=True,
        ),
        SettingsFieldDefinition(
            key="cr_code_prefix",
            field_type="str",
            label="پیشوند کد درخواست تغییر",
            label_en="CR Code Prefix",
            default_value="CR",
        ),
    ),
)


# ─── Register Schema ─────────────────────────────────────────

pm_settings_schema = SettingsSchemaDefinition(
    module_key="pm",
    version="1.0.0",
    label="تنظیمات مدیریت پروژه",
    label_en="Project Management Settings",
    description="تنظیمات ماژول مدیریت پروژه",
    sections=(
        general_section,
        scheduling_section,
        cost_section,
        resource_section,
        risk_section,
        baseline_section,
        change_request_section,
    ),
)


def register_pm_settings():
    """ثبت schema تنظیمات PM در رجیستری."""
    settings_schema_registry.register(pm_settings_schema)
