<?php

namespace App\Livewire\Admin;

use App\Domain\Shared\Models\SystemSetting;
use App\Domain\Shared\Services\SettingsService;
use Livewire\Attributes\Layout;
use Livewire\Attributes\Title;
use Livewire\Component;

#[Layout('layouts.app')]
#[Title('إعدادات النظام')]
class SystemSettings extends Component
{
    public string $activeTab = 'general';
    public array $settings = [];

    protected array $settingsSchema = [
        'general' => [
            'academy_name_ar' => ['type' => 'string', 'label' => 'اسم الأكاديمية (عربي)'],
            'academy_name_en' => ['type' => 'string', 'label' => 'اسم الأكاديمية (إنجليزي)'],
            'default_locale' => ['type' => 'select', 'label' => 'اللغة الافتراضية', 'options' => ['ar' => 'العربية', 'en' => 'English']],
            'timezone' => ['type' => 'select', 'label' => 'المنطقة الزمنية', 'options' => ['Africa/Cairo' => 'القاهرة', 'Asia/Riyadh' => 'الرياض', 'Asia/Dubai' => 'دبي', 'UTC' => 'UTC']],
        ],
        'financial' => [
            'currency_code' => ['type' => 'select', 'label' => 'رمز العملة', 'options' => ['EGP' => 'جنيه مصري (EGP)', 'SAR' => 'ريال سعودي (SAR)', 'AED' => 'درهم إماراتي (AED)', 'USD' => 'دولار أمريكي (USD)']],
            'tax_rate' => ['type' => 'number', 'label' => 'نسبة الضريبة (%)', 'step' => '0.01', 'min' => 0, 'max' => 100],
            'max_discount_percent' => ['type' => 'number', 'label' => 'الحد الأقصى للخصم (%)', 'step' => '1', 'min' => 0, 'max' => 100],
            'wallet_enabled' => ['type' => 'boolean', 'label' => 'تفعيل المحفظة'],
        ],
        'attendance' => [
            'grace_period_participants' => ['type' => 'number', 'label' => 'فترة السماح للمشتركين (دقيقة)', 'step' => '1', 'min' => 0],
            'grace_period_trainers' => ['type' => 'number', 'label' => 'فترة السماح للمدربين (دقيقة)', 'step' => '1', 'min' => 0],
            'auto_absent_delay' => ['type' => 'number', 'label' => 'تأخير الغياب التلقائي (ساعة)', 'step' => '1', 'min' => 1],
            'consecutive_absence_threshold' => ['type' => 'number', 'label' => 'حد الغياب المتتالي', 'step' => '1', 'min' => 1],
            'min_attendance_percentage' => ['type' => 'number', 'label' => 'الحد الأدنى لنسبة الحضور (%)', 'step' => '1', 'min' => 0, 'max' => 100],
        ],
        'notifications' => [
            'sms_enabled' => ['type' => 'boolean', 'label' => 'تفعيل الرسائل القصيرة'],
            'email_enabled' => ['type' => 'boolean', 'label' => 'تفعيل البريد الإلكتروني'],
            'digest_time' => ['type' => 'time', 'label' => 'وقت الملخص اليومي'],
            'sms_rate_limit' => ['type' => 'number', 'label' => 'حد الرسائل القصيرة (بالساعة)', 'step' => '1', 'min' => 1],
        ],
        'enrollment' => [
            'allow_waitlist' => ['type' => 'boolean', 'label' => 'تفعيل قائمة الانتظار'],
            'max_waitlist_per_group' => ['type' => 'number', 'label' => 'الحد الأقصى لقائمة الانتظار لكل مجموعة', 'step' => '1', 'min' => 0],
            'auto_promote_waitlist' => ['type' => 'boolean', 'label' => 'ترقية تلقائية من قائمة الانتظار'],
        ],
    ];

    protected array $defaults = [
        'academy_name_ar' => '',
        'academy_name_en' => '',
        'default_locale' => 'ar',
        'timezone' => 'Africa/Cairo',
        'currency_code' => 'EGP',
        'tax_rate' => '14',
        'max_discount_percent' => '50',
        'wallet_enabled' => '0',
        'grace_period_participants' => '15',
        'grace_period_trainers' => '10',
        'auto_absent_delay' => '2',
        'consecutive_absence_threshold' => '5',
        'min_attendance_percentage' => '75',
        'sms_enabled' => '0',
        'email_enabled' => '1',
        'digest_time' => '08:00',
        'sms_rate_limit' => '100',
        'allow_waitlist' => '1',
        'max_waitlist_per_group' => '10',
        'auto_promote_waitlist' => '1',
    ];

    public function mount(): void
    {
        $this->authorize('settings.manage');
        $this->loadAllSettings();
    }

    public function loadAllSettings(): void
    {
        $academyId = app('current_academy')?->id;
        if (!$academyId) {
            return;
        }

        $records = SystemSetting::withoutGlobalScope('academy')
            ->where('academy_id', $academyId)
            ->get()
            ->mapWithKeys(fn ($s) => [$s->key => $s->value])
            ->toArray();

        // Merge defaults with stored values
        $this->settings = array_merge($this->defaults, $records);
    }

    public function save(SettingsService $service): void
    {
        $group = $this->activeTab;
        $schema = $this->settingsSchema[$group] ?? [];

        foreach ($schema as $key => $config) {
            $value = $this->settings[$key] ?? $this->defaults[$key] ?? '';

            // Normalize boolean values
            if ($config['type'] === 'boolean') {
                $value = $value ? '1' : '0';
            }

            $type = match ($config['type']) {
                'boolean' => 'boolean',
                'number' => str_contains($config['step'] ?? '1', '.') ? 'float' : 'integer',
                default => 'string',
            };

            $service->set($key, $value, $group, $type);
        }

        session()->flash('success', __('تم حفظ الإعدادات بنجاح'));
    }

    public function getActiveSchemaProperty(): array
    {
        return $this->settingsSchema[$this->activeTab] ?? [];
    }

    public function render()
    {
        $tabs = [
            'general' => __('عام'),
            'financial' => __('مالي'),
            'attendance' => __('الحضور'),
            'notifications' => __('الإشعارات'),
            'enrollment' => __('التسجيل'),
        ];

        return view('livewire.admin.system-settings', [
            'tabs' => $tabs,
            'schema' => $this->settingsSchema[$this->activeTab] ?? [],
        ]);
    }
}
