<?php
declare(strict_types=1);

namespace App\Modules\Pricing\Services;

final class RuleFieldMapper
{
    private static array $keyConfig = [
        'percentage'                 => ['label' => 'النسبة', 'suffix' => '%', 'type' => 'number', 'step' => '0.01'],
        'percentage_of_subscription' => ['label' => 'نسبة من الاشتراك', 'suffix' => '%', 'type' => 'number', 'step' => '0.01'],
        'max_percentage'             => ['label' => 'أقصى نسبة', 'suffix' => '%', 'type' => 'number', 'step' => '0.01'],
        'discount_percentage'        => ['label' => 'نسبة الخصم', 'suffix' => '%', 'type' => 'number', 'step' => '0.01'],
        'increase_percentage'        => ['label' => 'نسبة الزيادة', 'suffix' => '%', 'type' => 'number', 'step' => '0.01'],
        'amount'                     => ['label' => 'المبلغ', 'suffix' => 'ج.م', 'type' => 'number', 'step' => '0.01'],
        'amount_usd'                 => ['label' => 'المبلغ', 'suffix' => 'USD', 'type' => 'number', 'step' => '0.01'],
        'annual_flat'                => ['label' => 'الرسم السنوي الثابت', 'suffix' => 'ج.م', 'type' => 'number', 'step' => '0.01'],
        'total'                      => ['label' => 'الإجمالي', 'suffix' => 'ج.م', 'type' => 'number', 'step' => '0.01'],
        'form'                       => ['label' => 'رسم الاستمارة', 'suffix' => 'ج.م', 'type' => 'number', 'step' => '0.01'],
        'stamp'                      => ['label' => 'طابع الشهداء', 'suffix' => 'ج.م', 'type' => 'number', 'step' => '0.01'],
        'fee_usd'                    => ['label' => 'الرسم', 'suffix' => 'USD', 'type' => 'number', 'step' => '0.01'],
        'value'                      => ['label' => 'القيمة', 'suffix' => '', 'type' => 'number', 'step' => '1'],
        'days'                       => ['label' => 'الأيام', 'suffix' => 'يوم', 'type' => 'number', 'step' => '1'],
        'months'                     => ['label' => 'الشهور', 'suffix' => 'شهر', 'type' => 'number', 'step' => '1'],
        'years'                      => ['label' => 'السنوات', 'suffix' => 'سنة', 'type' => 'number', 'step' => '1'],
        'max_years'                  => ['label' => 'أقصى سنوات', 'suffix' => 'سنة', 'type' => 'number', 'step' => '1'],
        'min_years'                  => ['label' => 'أقل سنوات', 'suffix' => 'سنة', 'type' => 'number', 'step' => '1'],
        'min'                        => ['label' => 'الحد الأدنى', 'suffix' => '', 'type' => 'number', 'step' => '1'],
        'max'                        => ['label' => 'الحد الأقصى', 'suffix' => '', 'type' => 'number', 'step' => '1'],
        'hour'                       => ['label' => 'الساعة', 'suffix' => '', 'type' => 'number', 'step' => '1'],
        'day'                        => ['label' => 'اليوم', 'suffix' => '', 'type' => 'number', 'step' => '1'],
        'month'                      => ['label' => 'الشهر', 'suffix' => '', 'type' => 'number', 'step' => '1'],
        'hours'                      => ['label' => 'الساعات', 'suffix' => 'ساعة', 'type' => 'number', 'step' => '1'],
        'minutes'                    => ['label' => 'الدقائق', 'suffix' => 'دقيقة', 'type' => 'number', 'step' => '1'],
        'units'                      => ['label' => 'الوحدات', 'suffix' => '', 'type' => 'number', 'step' => '1'],
        'until_age'                  => ['label' => 'حتى سن', 'suffix' => 'سنة', 'type' => 'number', 'step' => '1'],
        'spouse'                     => ['label' => 'الأزواج', 'suffix' => '', 'type' => 'number', 'step' => '1'],
        'children'                   => ['label' => 'الأبناء', 'suffix' => '', 'type' => 'number', 'step' => '1'],
        'exempt'                     => ['label' => 'معفى', 'suffix' => '', 'type' => 'toggle'],
        'renewable'                  => ['label' => 'قابل للتجديد', 'suffix' => '', 'type' => 'toggle'],
        'same_number'                => ['label' => 'نفس الرقم', 'suffix' => '', 'type' => 'toggle'],
        'waived_if_children'         => ['label' => 'يُعفى بوجود أبناء', 'suffix' => '', 'type' => 'toggle'],
        'drop_after'                 => ['label' => 'إسقاط بعدها', 'suffix' => '', 'type' => 'toggle'],
        'base'                       => ['label' => 'الأساس', 'suffix' => '', 'type' => 'text'],
        'type'                       => ['label' => 'النوع', 'suffix' => '', 'type' => 'text'],
        'treat_as'                   => ['label' => 'يُعامل كـ', 'suffix' => '', 'type' => 'text'],
        'fee_type'                   => ['label' => 'نوع الرسم', 'suffix' => '', 'type' => 'text'],
        'transfer_to'                => ['label' => 'ينتقل إلى', 'suffix' => '', 'type' => 'text'],
        'currency'                   => ['label' => 'العملة', 'suffix' => '', 'type' => 'text'],
        'note'                       => ['label' => 'ملاحظة', 'suffix' => '', 'type' => 'text'],
        'format'                     => ['label' => 'الصيغة', 'suffix' => '', 'type' => 'text'],
        'date'                       => ['label' => 'التاريخ', 'suffix' => '', 'type' => 'date'],
        'start_seq'                  => ['label' => 'رقم البداية', 'suffix' => '', 'type' => 'number', 'step' => '1'],
        'base_date_rule'             => ['label' => 'قاعدة تاريخ الأساس', 'suffix' => '', 'type' => 'text'],
        'partial_year_rule'          => ['label' => 'قاعدة جزء السنة', 'suffix' => '', 'type' => 'text'],
    ];

    public static function getFieldConfig(string $key): array
    {
        return self::$keyConfig[$key] ?? ['label' => $key, 'suffix' => '', 'type' => 'text', 'step' => ''];
    }

    public static function renderFields(array $rule): string
    {
        $ruleCode = $rule['rule_code'];
        $values = json_decode($rule['current_value_json'], true) ?? [];
        $dataType = $rule['data_type'] ?? 'string';

        if (empty($values) || !is_array($values)) {
            return self::renderRawField($ruleCode, $rule['current_value_json']);
        }

        $html = '';
        foreach ($values as $key => $value) {
            $config = self::getFieldConfig($key);
            $inputName = "rule[{$ruleCode}][{$key}]";

            if ($config['type'] === 'toggle') {
                $html .= self::renderToggle($inputName, $key, $config, $value);
            } elseif ($config['type'] === 'number') {
                $html .= self::renderNumber($inputName, $key, $config, $value);
            } elseif ($config['type'] === 'date') {
                $html .= self::renderDate($inputName, $key, $config, $value);
            } else {
                $html .= self::renderText($inputName, $key, $config, $value);
            }
        }

        return $html;
    }

    private static function renderNumber(string $name, string $key, array $config, mixed $value): string
    {
        $label = e($config['label']);
        $suffix = e($config['suffix']);
        $step = $config['step'] ?? '1';
        $val = e((string) $value);

        $suffixHtml = $suffix ? "<span class=\"pricing-input-suffix\">{$suffix}</span>" : '';

        return <<<HTML
        <div class="pricing-input-group">
            <label class="pricing-input-label">{$label}</label>
            <div class="pricing-input-wrap">
                <input type="number" name="{$name}" value="{$val}" step="{$step}" class="form-input pricing-input" dir="ltr" data-key="{$key}">
                {$suffixHtml}
            </div>
        </div>
        HTML;
    }

    private static function renderToggle(string $name, string $key, array $config, mixed $value): string
    {
        $label = e($config['label']);
        $checked = ($value === true || $value === 1 || $value === '1' || $value === 'true') ? 'checked' : '';

        return <<<HTML
        <div class="pricing-input-group">
            <label class="pricing-input-label">{$label}</label>
            <div class="pricing-input-wrap">
                <input type="hidden" name="{$name}" value="0">
                <label class="toggle-switch">
                    <input type="checkbox" name="{$name}" value="1" {$checked} data-key="{$key}">
                    <span class="toggle-slider"></span>
                </label>
            </div>
        </div>
        HTML;
    }

    private static function renderText(string $name, string $key, array $config, mixed $value): string
    {
        $label = e($config['label']);
        $val = e((string) $value);

        return <<<HTML
        <div class="pricing-input-group">
            <label class="pricing-input-label">{$label}</label>
            <div class="pricing-input-wrap">
                <input type="text" name="{$name}" value="{$val}" class="form-input pricing-input" data-key="{$key}">
            </div>
        </div>
        HTML;
    }

    private static function renderDate(string $name, string $key, array $config, mixed $value): string
    {
        $label = e($config['label']);
        $val = e((string) $value);

        return <<<HTML
        <div class="pricing-input-group">
            <label class="pricing-input-label">{$label}</label>
            <div class="pricing-input-wrap">
                <input type="date" name="{$name}" value="{$val}" class="form-input pricing-input" dir="ltr" data-key="{$key}">
            </div>
        </div>
        HTML;
    }

    private static function renderRawField(string $ruleCode, string $json): string
    {
        $val = e($json);
        return <<<HTML
        <div class="pricing-input-group" style="grid-column:1/-1;">
            <label class="pricing-input-label">القيمة (JSON)</label>
            <div class="pricing-input-wrap">
                <input type="text" name="rule_raw[{$ruleCode}]" value="{$val}" class="form-input pricing-input" dir="ltr" style="font-family:monospace;">
            </div>
        </div>
        HTML;
    }

    public static function getCategoryConfig(): array
    {
        return [
            'financial' => [
                'label' => 'الرسوم المالية',
                'icon'  => '💰',
                'color' => '#0D7377',
                'description' => 'رسوم الاستمارات، التنمية، الأقساط، البدل',
            ],
            'spouse_fee' => [
                'label' => 'رسوم الأزواج',
                'icon'  => '💍',
                'color' => '#7C3AED',
                'description' => 'نسب ورسوم إضافة الزوجات',
            ],
            'children_fee' => [
                'label' => 'رسوم الأبناء',
                'icon'  => '👶',
                'color' => '#2563EB',
                'description' => 'نسب ورسوم إضافة الأبناء حسب السن',
            ],
            'separation_fee' => [
                'label' => 'رسوم الفصل والتنازل',
                'icon'  => '📋',
                'color' => '#DC2626',
                'description' => 'نسب الفصل حسب السنة، رسوم التنازل، التحويل الرياضي',
            ],
            'divorce' => [
                'label' => 'رسوم الطلاق',
                'icon'  => '⚖️',
                'color' => '#9333EA',
                'description' => 'نسب ورسوم حالات الطلاق',
            ],
            'penalty' => [
                'label' => 'الغرامات والجزاءات',
                'icon'  => '⚠️',
                'color' => '#D97706',
                'description' => 'غرامات التأخير، حدود المخالفات، الإسقاط',
            ],
            'discount' => [
                'label' => 'الخصومات',
                'icon'  => '🏷️',
                'color' => '#059669',
                'description' => 'خصومات المجموعات والفروع',
            ],
            'foreign' => [
                'label' => 'الأعضاء الأجانب',
                'icon'  => '🌍',
                'color' => '#6366F1',
                'description' => 'رسوم العضوية الأجنبية والفخرية والرياضية',
            ],
            'temporary' => [
                'label' => 'العضوية المؤقتة والموسمية',
                'icon'  => '⏳',
                'color' => '#0284C7',
                'description' => 'رسوم وشروط العضوية المؤقتة والموسمية',
            ],
            'membership' => [
                'label' => 'رسوم العضوية',
                'icon'  => '🏠',
                'color' => '#475569',
                'description' => 'رسوم المؤقتين والمربيات',
            ],
            'age' => [
                'label' => 'حدود السن',
                'icon'  => '📅',
                'color' => '#64748B',
                'description' => 'الأعمار المطلوبة والحدود القصوى',
            ],
            'workflow' => [
                'label' => 'إعدادات سير العمل',
                'icon'  => '⚙️',
                'color' => '#374151',
                'description' => 'مواعيد التحصيل، صلاحيات الاستمارات، التجميد',
            ],
        ];
    }
}
