"""
Inventory 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="allow_negative_stock",
            field_type="bool",
            label="اجازه موجودی منفی",
            label_en="Allow Negative Stock",
            default_value=False,
            description="در صورت فعال‌سازی، خروج کالا حتی با موجودی صفر مجاز است",
        ),
        SettingsFieldDefinition(
            key="default_uom_precision",
            field_type="int",
            label="دقت اعشار واحد اندازه‌گیری",
            label_en="Default UOM Precision",
            default_value=2,
            min_value=0,
            max_value=6,
        ),
        SettingsFieldDefinition(
            key="auto_generate_item_code",
            field_type="bool",
            label="تولید خودکار کد کالا",
            label_en="Auto-generate Item Code",
            default_value=True,
        ),
        SettingsFieldDefinition(
            key="item_code_prefix",
            field_type="str",
            label="پیشوند کد کالا",
            label_en="Item Code Prefix",
            default_value="ITM",
        ),
    ),
)

# ─── Tracking Section ────────────────────────────────────────

tracking_section = SettingsSectionDefinition(
    key="tracking",
    label="تنظیمات ردیابی",
    label_en="Tracking Settings",
    description="تنظیمات ردیابی بچ، سریال و تاریخ انقضا",
    icon="HiOutlineQrCode",
    order=2,
    fields=(
        SettingsFieldDefinition(
            key="enable_batch_tracking",
            field_type="bool",
            label="ردیابی بچ/لات",
            label_en="Enable Batch Tracking",
            default_value=False,
            description="فعال‌سازی ردیابی شماره بچ/لات برای کالاها",
        ),
        SettingsFieldDefinition(
            key="enable_serial_tracking",
            field_type="bool",
            label="ردیابی شماره سریال",
            label_en="Enable Serial Tracking",
            default_value=False,
        ),
        SettingsFieldDefinition(
            key="enable_expiry_tracking",
            field_type="bool",
            label="ردیابی تاریخ انقضا",
            label_en="Enable Expiry Tracking",
            default_value=False,
        ),
        SettingsFieldDefinition(
            key="default_warranty_months",
            field_type="int",
            label="مدت گارانتی پیش‌فرض (ماه)",
            label_en="Default Warranty Months",
            default_value=12,
            min_value=0,
            max_value=120,
        ),
        SettingsFieldDefinition(
            key="expiry_warning_days",
            field_type="int",
            label="هشدار انقضا (روز قبل)",
            label_en="Expiry Warning Days Before",
            default_value=30,
            min_value=0,
            max_value=365,
            description="تعداد روز قبل از انقضا برای نمایش هشدار",
        ),
    ),
)

# ─── Costing Section ─────────────────────────────────────────

costing_section = SettingsSectionDefinition(
    key="costing",
    label="تنظیمات قیمت‌گذاری",
    label_en="Costing Settings",
    description="تنظیمات روش قیمت‌گذاری و محاسبه بهای تمام‌شده",
    icon="HiOutlineCalculator",
    order=3,
    fields=(
        SettingsFieldDefinition(
            key="default_costing_method",
            field_type="select",
            label="روش قیمت‌گذاری پیش‌فرض",
            label_en="Default Costing Method",
            default_value="MAP",
            options=[
                {"value": "MAP", "label": "میانگین موزون (MAP)"},
                {"value": "STANDARD", "label": "استاندارد"},
                {"value": "FIFO", "label": "FIFO (اولین ورود - اولین خروج)"},
                {"value": "LIFO", "label": "LIFO (آخرین ورود - اولین خروج)"},
                {"value": "ACTUAL", "label": "واقعی"},
            ],
        ),
        SettingsFieldDefinition(
            key="auto_calculate_cost",
            field_type="bool",
            label="محاسبه خودکار بهای تمام‌شده",
            label_en="Auto Calculate Cost",
            default_value=True,
        ),
        SettingsFieldDefinition(
            key="allow_zero_cost_transactions",
            field_type="bool",
            label="اجازه تراکنش با بهای صفر",
            label_en="Allow Zero Cost Transactions",
            default_value=False,
        ),
    ),
)

# ─── Reorder Section ─────────────────────────────────────────

reorder_section = SettingsSectionDefinition(
    key="reorder",
    label="تنظیمات سفارش مجدد",
    label_en="Reorder Settings",
    description="تنظیمات نقطه سفارش و موجودی ایمنی",
    icon="HiOutlineArrowPath",
    order=4,
    fields=(
        SettingsFieldDefinition(
            key="enable_reorder_alerts",
            field_type="bool",
            label="هشدار نقطه سفارش",
            label_en="Enable Reorder Alerts",
            default_value=True,
            description="ارسال هشدار هنگام رسیدن موجودی به نقطه سفارش",
        ),
        SettingsFieldDefinition(
            key="default_lead_time_days",
            field_type="int",
            label="زمان تحویل پیش‌فرض (روز)",
            label_en="Default Lead Time (days)",
            default_value=7,
            min_value=0,
            max_value=365,
        ),
        SettingsFieldDefinition(
            key="default_safety_stock_percentage",
            field_type="float",
            label="درصد موجودی ایمنی پیش‌فرض",
            label_en="Default Safety Stock Percentage",
            default_value=10.0,
            min_value=0.0,
            max_value=100.0,
        ),
    ),
)

# ─── Physical Inventory Section ───────────────────────────────

physical_inventory_section = SettingsSectionDefinition(
    key="physical_inventory",
    label="تنظیمات شمارش موجودی",
    label_en="Physical Inventory Settings",
    description="تنظیمات انبارگردانی و شمارش فیزیکی",
    icon="HiOutlineClipboardDocumentList",
    order=5,
    fields=(
        SettingsFieldDefinition(
            key="blind_count",
            field_type="bool",
            label="شمارش کور",
            label_en="Blind Count",
            default_value=False,
            description="مقدار دفتری هنگام شمارش از شمارشگر مخفی می‌شود",
        ),
        SettingsFieldDefinition(
            key="freeze_stock_during_count",
            field_type="bool",
            label="توقف حرکات هنگام شمارش",
            label_en="Freeze Stock During Count",
            default_value=True,
            description="جلوگیری از حرکات انبار هنگام شمارش فیزیکی",
        ),
        SettingsFieldDefinition(
            key="count_rounds",
            field_type="int",
            label="تعداد مراحل شمارش",
            label_en="Count Rounds",
            default_value=1,
            min_value=1,
            max_value=3,
        ),
        SettingsFieldDefinition(
            key="variance_threshold_percent",
            field_type="float",
            label="آستانه مغایرت (درصد)",
            label_en="Variance Threshold (%)",
            default_value=5.0,
            min_value=0.0,
            max_value=100.0,
            description="آستانه درصد مغایرت برای علامت‌گذاری خودکار",
        ),
        SettingsFieldDefinition(
            key="default_cycle_count_frequency_days",
            field_type="int",
            label="دوره شمارش چرخشی (روز)",
            label_en="Cycle Count Frequency (days)",
            default_value=30,
            min_value=1,
            max_value=365,
        ),
        SettingsFieldDefinition(
            key="auto_adjust_after_count",
            field_type="bool",
            label="تعدیل خودکار پس از شمارش",
            label_en="Auto Adjust After Count",
            default_value=False,
            description="تعدیل خودکار موجودی در صورت مغایرت کمتر از آستانه",
        ),
    ),
)

# ─── Quality Section ─────────────────────────────────────────

quality_section = SettingsSectionDefinition(
    key="quality",
    label="تنظیمات کنترل کیفیت",
    label_en="Quality Control Settings",
    description="تنظیمات بازرسی و کنترل کیفیت",
    icon="HiOutlineShieldCheck",
    order=6,
    fields=(
        SettingsFieldDefinition(
            key="enable_incoming_inspection",
            field_type="bool",
            label="بازرسی ورودی",
            label_en="Enable Incoming Inspection",
            default_value=False,
            description="الزام بازرسی کیفیت برای کالاهای ورودی",
        ),
        SettingsFieldDefinition(
            key="enable_outgoing_inspection",
            field_type="bool",
            label="بازرسی خروجی",
            label_en="Enable Outgoing Inspection",
            default_value=False,
        ),
        SettingsFieldDefinition(
            key="default_sample_percentage",
            field_type="float",
            label="درصد نمونه‌گیری پیش‌فرض",
            label_en="Default Sample Percentage",
            default_value=10.0,
            min_value=0.0,
            max_value=100.0,
        ),
        SettingsFieldDefinition(
            key="auto_quarantine_on_fail",
            field_type="bool",
            label="قرنطینه خودکار در صورت عدم تأیید",
            label_en="Auto Quarantine on Fail",
            default_value=True,
        ),
    ),
)

# ─── Reservation Section ─────────────────────────────────────

reservation_section = SettingsSectionDefinition(
    key="reservation",
    label="تنظیمات رزرو موجودی",
    label_en="Reservation Settings",
    description="تنظیمات رزرو و تخصیص موجودی",
    icon="HiOutlineLockClosed",
    order=7,
    fields=(
        SettingsFieldDefinition(
            key="default_reservation_priority",
            field_type="int",
            label="اولویت پیش‌فرض رزرو",
            label_en="Default Reservation Priority",
            default_value=5,
            min_value=1,
            max_value=10,
        ),
        SettingsFieldDefinition(
            key="reservation_expiry_hours",
            field_type="int",
            label="انقضای رزرو (ساعت)",
            label_en="Reservation Expiry (hours)",
            default_value=72,
            min_value=1,
            max_value=720,
            description="مدت زمان اعتبار رزرو قبل از انقضای خودکار",
        ),
        SettingsFieldDefinition(
            key="auto_release_expired_reservations",
            field_type="bool",
            label="آزادسازی خودکار رزروهای منقضی",
            label_en="Auto Release Expired Reservations",
            default_value=True,
        ),
    ),
)

# ─── Reporting Section ───────────────────────────────────────

reporting_section = SettingsSectionDefinition(
    key="reporting",
    label="تنظیمات گزارش‌گیری",
    label_en="Reporting Settings",
    description="تنظیمات گزارش‌ها و تحلیل موجودی",
    icon="HiOutlineChartBar",
    order=8,
    fields=(
        SettingsFieldDefinition(
            key="aging_bucket_ranges",
            field_type="str",
            label="بازه‌های عمر موجودی (روز)",
            label_en="Aging Bucket Ranges",
            default_value="0-30,31-60,61-90,91-180,181+",
            description="بازه‌های جدا شده با کاما (مثلاً: 0-30,31-60,61-90,91-180,181+)",
        ),
        SettingsFieldDefinition(
            key="abc_class_a_percent",
            field_type="float",
            label="درصد کلاس A",
            label_en="ABC Class A Percentage",
            default_value=20.0,
            min_value=1.0,
            max_value=100.0,
            description="درصد اقلامی که ۸۰٪ ارزش را تشکیل می‌دهند",
        ),
        SettingsFieldDefinition(
            key="abc_class_b_percent",
            field_type="float",
            label="درصد کلاس B",
            label_en="ABC Class B Percentage",
            default_value=30.0,
            min_value=1.0,
            max_value=100.0,
        ),
    ),
)


# ─── Register Schema ─────────────────────────────────────────

inventory_settings_schema = SettingsSchemaDefinition(
    module_key="inventory",
    version="1.0.0",
    label="تنظیمات انبار و موجودی",
    label_en="Inventory Settings",
    description="تنظیمات ماژول مدیریت انبار و موجودی",
    sections=(
        general_section,
        tracking_section,
        costing_section,
        reorder_section,
        physical_inventory_section,
        quality_section,
        reservation_section,
        reporting_section,
    ),
)


def register_inventory_settings():
    """ثبت schema تنظیمات Inventory در رجیستری."""
    settings_schema_registry.register(inventory_settings_schema)
