"""
HRM 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


# ─── Employee Section ─────────────────────────────────────────

employee_section = SettingsSectionDefinition(
    key="employee",
    label="تنظیمات کارمندان",
    label_en="Employee Settings",
    description="تنظیمات پیش‌فرض و رفتار مدیریت کارمندان",
    icon="HiOutlineUsers",
    order=1,
    fields=(
        SettingsFieldDefinition(
            key="default_employment_type",
            field_type="select",
            label="نوع استخدام پیش‌فرض",
            label_en="Default Employment Type",
            default_value="FULL_TIME",
            options=[
                {"value": "FULL_TIME", "label": "تمام‌وقت"},
                {"value": "PART_TIME", "label": "پاره‌وقت"},
                {"value": "CONTRACT", "label": "قراردادی"},
                {"value": "INTERN", "label": "کارآموز"},
            ],
        ),
        SettingsFieldDefinition(
            key="probation_duration_days",
            field_type="int",
            label="مدت دوره آزمایشی (روز)",
            label_en="Probation Duration (days)",
            default_value=90,
            min_value=0,
            max_value=365,
        ),
        SettingsFieldDefinition(
            key="auto_generate_employee_code",
            field_type="bool",
            label="تولید خودکار کد پرسنلی",
            label_en="Auto-generate Employee Code",
            default_value=True,
        ),
        SettingsFieldDefinition(
            key="employee_code_prefix",
            field_type="str",
            label="پیشوند کد پرسنلی",
            label_en="Employee Code Prefix",
            default_value="EMP",
            description="پیشوند استفاده‌شده در تولید خودکار کد پرسنلی",
        ),
        SettingsFieldDefinition(
            key="require_national_id",
            field_type="bool",
            label="الزام کد ملی",
            label_en="Require National ID",
            default_value=True,
        ),
        SettingsFieldDefinition(
            key="default_nationality",
            field_type="str",
            label="ملیت پیش‌فرض",
            label_en="Default Nationality",
            default_value="IR",
        ),
    ),
)

# ─── Leave Section ────────────────────────────────────────────

leave_section = SettingsSectionDefinition(
    key="leave",
    label="تنظیمات مرخصی",
    label_en="Leave Settings",
    description="مدیریت سیاست‌ها و رفتار سیستم مرخصی",
    icon="HiOutlineCalendar",
    order=2,
    fields=(
        SettingsFieldDefinition(
            key="annual_entitlement_days",
            field_type="int",
            label="روز مرخصی سالانه",
            label_en="Annual Entitlement Days",
            default_value=26,
            min_value=0,
            max_value=365,
        ),
        SettingsFieldDefinition(
            key="max_carryover_days",
            field_type="int",
            label="حداکثر روز قابل انتقال",
            label_en="Max Carryover Days",
            default_value=10,
            min_value=0,
            max_value=365,
        ),
        SettingsFieldDefinition(
            key="max_accumulation_days",
            field_type="int",
            label="حداکثر انباشت مرخصی",
            label_en="Max Accumulation Days",
            default_value=36,
            min_value=0,
            max_value=365,
        ),
        SettingsFieldDefinition(
            key="accrual_method",
            field_type="select",
            label="روش تعلق مرخصی",
            label_en="Accrual Method",
            default_value="MONTHLY",
            options=[
                {"value": "ANNUAL", "label": "سالانه"},
                {"value": "MONTHLY", "label": "ماهانه"},
                {"value": "DAILY", "label": "روزانه"},
                {"value": "CUSTOM", "label": "سفارشی"},
            ],
        ),
        SettingsFieldDefinition(
            key="require_approval",
            field_type="bool",
            label="نیاز به تأیید مدیر",
            label_en="Require Manager Approval",
            default_value=True,
        ),
        SettingsFieldDefinition(
            key="max_consecutive_days",
            field_type="int",
            label="حداکثر مرخصی متوالی (روز)",
            label_en="Max Consecutive Days",
            default_value=30,
            min_value=1,
            max_value=365,
        ),
        SettingsFieldDefinition(
            key="min_notice_days",
            field_type="int",
            label="حداقل روز اعلام قبلی",
            label_en="Min Notice Days",
            default_value=1,
            min_value=0,
            max_value=90,
        ),
        SettingsFieldDefinition(
            key="allow_half_day",
            field_type="bool",
            label="مرخصی نیم‌روز",
            label_en="Allow Half Day Leave",
            default_value=True,
        ),
        SettingsFieldDefinition(
            key="allow_hourly",
            field_type="bool",
            label="مرخصی ساعتی",
            label_en="Allow Hourly Leave",
            default_value=False,
        ),
        SettingsFieldDefinition(
            key="min_service_months",
            field_type="int",
            label="حداقل سابقه برای مرخصی (ماه)",
            label_en="Min Service Months for Leave",
            default_value=0,
            min_value=0,
            max_value=24,
        ),
        SettingsFieldDefinition(
            key="auto_approve_if_balance_sufficient",
            field_type="bool",
            label="تأیید خودکار اگر مانده کافی",
            label_en="Auto Approve if Balance Sufficient",
            default_value=False,
            description="در صورت فعال‌سازی، درخواست مرخصی با مانده کافی خودکار تأیید می‌شود",
        ),
    ),
)

# ─── Time & Attendance Section ────────────────────────────────

time_attendance_section = SettingsSectionDefinition(
    key="time_attendance",
    label="تنظیمات حضور و غیاب",
    label_en="Time & Attendance Settings",
    description="تنظیمات ساعت کاری، شیفت و حضور و غیاب",
    icon="HiOutlineClock",
    order=3,
    fields=(
        SettingsFieldDefinition(
            key="schedule_type",
            field_type="select",
            label="نوع برنامه کاری پیش‌فرض",
            label_en="Default Schedule Type",
            default_value="STANDARD",
            options=[
                {"value": "STANDARD", "label": "استاندارد"},
                {"value": "SHIFT", "label": "شیفتی"},
                {"value": "FLEXIBLE", "label": "شناور"},
                {"value": "COMPRESSED", "label": "فشرده"},
                {"value": "REMOTE", "label": "دورکاری"},
            ],
        ),
        SettingsFieldDefinition(
            key="daily_work_hours",
            field_type="float",
            label="ساعت کاری روزانه",
            label_en="Daily Work Hours",
            default_value=8.0,
            min_value=1.0,
            max_value=16.0,
        ),
        SettingsFieldDefinition(
            key="weekly_work_hours",
            field_type="float",
            label="ساعت کاری هفتگی",
            label_en="Weekly Work Hours",
            default_value=44.0,
            min_value=1.0,
            max_value=84.0,
        ),
        SettingsFieldDefinition(
            key="break_duration_minutes",
            field_type="int",
            label="مدت استراحت (دقیقه)",
            label_en="Break Duration (minutes)",
            default_value=60,
            min_value=0,
            max_value=180,
        ),
        SettingsFieldDefinition(
            key="working_days",
            field_type="multi_select",
            label="روزهای کاری",
            label_en="Working Days",
            default_value=[0, 1, 2, 3, 4],
            options=[
                {"value": 0, "label": "شنبه"},
                {"value": 1, "label": "یکشنبه"},
                {"value": 2, "label": "دوشنبه"},
                {"value": 3, "label": "سه‌شنبه"},
                {"value": 4, "label": "چهارشنبه"},
                {"value": 5, "label": "پنجشنبه"},
                {"value": 6, "label": "جمعه"},
            ],
        ),
        SettingsFieldDefinition(
            key="overtime_daily_threshold",
            field_type="float",
            label="آستانه اضافه‌کاری روزانه (ساعت)",
            label_en="Daily Overtime Threshold (hours)",
            default_value=8.0,
            min_value=1.0,
            max_value=16.0,
        ),
        SettingsFieldDefinition(
            key="overtime_weekly_threshold",
            field_type="float",
            label="آستانه اضافه‌کاری هفتگی (ساعت)",
            label_en="Weekly Overtime Threshold (hours)",
            default_value=44.0,
            min_value=1.0,
            max_value=84.0,
        ),
        SettingsFieldDefinition(
            key="late_tolerance_minutes",
            field_type="int",
            label="حد مجاز تأخیر (دقیقه)",
            label_en="Late Tolerance (minutes)",
            default_value=15,
            min_value=0,
            max_value=120,
        ),
        SettingsFieldDefinition(
            key="attendance_source",
            field_type="select",
            label="منبع ثبت حضور",
            label_en="Attendance Source",
            default_value="MANUAL",
            options=[
                {"value": "MANUAL", "label": "دستی"},
                {"value": "BIOMETRIC", "label": "بیومتریک"},
                {"value": "GPS", "label": "GPS"},
                {"value": "MOBILE", "label": "موبایل"},
            ],
        ),
        SettingsFieldDefinition(
            key="require_timesheet_approval",
            field_type="bool",
            label="نیاز به تأیید کارکرد",
            label_en="Require Timesheet Approval",
            default_value=True,
        ),
    ),
)

# ─── Payroll Section ──────────────────────────────────────────

payroll_section = SettingsSectionDefinition(
    key="payroll",
    label="تنظیمات حقوق و دستمزد",
    label_en="Payroll Settings",
    description="تنظیمات ضرایب حقوقی و پرداخت",
    icon="HiOutlineBanknotes",
    order=4,
    fields=(
        SettingsFieldDefinition(
            key="overtime_multiplier",
            field_type="float",
            label="ضریب اضافه‌کاری",
            label_en="Overtime Multiplier",
            default_value=1.4,
            min_value=1.0,
            max_value=3.0,
            description="ضریب محاسبه اضافه‌کاری (مثلاً ۱.۴ = ۱۴۰٪)",
        ),
        SettingsFieldDefinition(
            key="holiday_multiplier",
            field_type="float",
            label="ضریب تعطیلات",
            label_en="Holiday Multiplier",
            default_value=1.4,
            min_value=1.0,
            max_value=3.0,
        ),
        SettingsFieldDefinition(
            key="night_shift_multiplier",
            field_type="float",
            label="ضریب شیفت شب",
            label_en="Night Shift Multiplier",
            default_value=1.35,
            min_value=1.0,
            max_value=3.0,
        ),
        SettingsFieldDefinition(
            key="default_currency",
            field_type="str",
            label="واحد پول پیش‌فرض",
            label_en="Default Currency",
            default_value="IRR",
        ),
        SettingsFieldDefinition(
            key="default_payment_method",
            field_type="select",
            label="روش پرداخت پیش‌فرض",
            label_en="Default Payment Method",
            default_value="BANK_TRANSFER",
            options=[
                {"value": "BANK_TRANSFER", "label": "انتقال بانکی"},
                {"value": "CHECK", "label": "چک"},
                {"value": "CASH", "label": "نقدی"},
            ],
        ),
        SettingsFieldDefinition(
            key="salary_frequency",
            field_type="select",
            label="دوره پرداخت حقوق",
            label_en="Salary Frequency",
            default_value="MONTHLY",
            options=[
                {"value": "HOURLY", "label": "ساعتی"},
                {"value": "MONTHLY", "label": "ماهانه"},
                {"value": "ANNUAL", "label": "سالانه"},
            ],
        ),
        SettingsFieldDefinition(
            key="cost_allocation_type",
            field_type="select",
            label="نوع تخصیص هزینه",
            label_en="Cost Allocation Type",
            default_value="DEPARTMENT",
            options=[
                {"value": "POSITION", "label": "پست سازمانی"},
                {"value": "DEPARTMENT", "label": "واحد سازمانی"},
                {"value": "PROJECT", "label": "پروژه"},
                {"value": "COST_CENTER", "label": "مرکز هزینه"},
            ],
        ),
    ),
)

# ─── Position Section ────────────────────────────────────────

position_section = SettingsSectionDefinition(
    key="position",
    label="تنظیمات پست‌ها و مشاغل",
    label_en="Position & Job Settings",
    description="تنظیمات پیش‌فرض پست‌ها و مشاغل سازمانی",
    icon="HiOutlineBriefcase",
    order=5,
    fields=(
        SettingsFieldDefinition(
            key="default_headcount",
            field_type="int",
            label="تعداد نیرو پیش‌فرض",
            label_en="Default Headcount",
            default_value=1,
            min_value=1,
            max_value=100,
        ),
        SettingsFieldDefinition(
            key="default_fte",
            field_type="float",
            label="معادل تمام‌وقت پیش‌فرض",
            label_en="Default FTE",
            default_value=1.0,
            min_value=0.1,
            max_value=1.0,
        ),
        SettingsFieldDefinition(
            key="enforce_budgeting",
            field_type="bool",
            label="الزام بودجه‌بندی پست‌ها",
            label_en="Enforce Position Budgeting",
            default_value=True,
        ),
        SettingsFieldDefinition(
            key="track_key_positions",
            field_type="bool",
            label="ردیابی پست‌های کلیدی",
            label_en="Track Key Positions",
            default_value=False,
        ),
        SettingsFieldDefinition(
            key="require_job_description",
            field_type="bool",
            label="الزام شرح شغل",
            label_en="Require Job Description",
            default_value=True,
        ),
    ),
)


# ─── Register Schema ─────────────────────────────────────────

hrm_settings_schema = SettingsSchemaDefinition(
    module_key="hrm",
    version="1.0.0",
    label="تنظیمات منابع انسانی",
    label_en="HRM Settings",
    description="تنظیمات ماژول مدیریت منابع انسانی",
    sections=(
        employee_section,
        leave_section,
        time_attendance_section,
        payroll_section,
        position_section,
    ),
)


def register_hrm_settings():
    """ثبت schema تنظیمات HRM در رجیستری."""
    settings_schema_registry.register(hrm_settings_schema)
