<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class SystemSettingsSeeder extends Seeder
{
    public function run(): void
    {
        $academyId = DB::table('academies')->value('id');
        if (!$academyId) {
            $this->command->warn('No academy found. Skipping system settings seed.');
            return;
        }

        $now = now();

        $settings = [
            // General
            ['group' => 'general', 'key' => 'academy_name_ar', 'value' => 'أكاديمية الكابتن', 'type' => 'string', 'label_ar' => 'اسم الأكاديمية (عربي)', 'description_ar' => 'اسم الأكاديمية بالعربية (يظهر في الفواتير والتقارير)'],
            ['group' => 'general', 'key' => 'academy_name_en', 'value' => 'El Captain Academy', 'type' => 'string', 'label_ar' => 'اسم الأكاديمية (إنجليزي)', 'description_ar' => 'اسم الأكاديمية بالإنجليزية'],
            ['group' => 'general', 'key' => 'default_language', 'value' => 'ar', 'type' => 'string', 'label_ar' => 'اللغة الافتراضية', 'description_ar' => 'اللغة الافتراضية للنظام (ar أو en)'],
            ['group' => 'general', 'key' => 'date_format', 'value' => 'Y-m-d', 'type' => 'string', 'label_ar' => 'صيغة التاريخ', 'description_ar' => 'صيغة التاريخ (Y-m-d أو d/m/Y)'],
            ['group' => 'general', 'key' => 'time_format', 'value' => 'H:i', 'type' => 'string', 'label_ar' => 'صيغة الوقت', 'description_ar' => 'صيغة الوقت (H:i أو h:i A)'],
            ['group' => 'general', 'key' => 'week_starts_on', 'value' => '6', 'type' => 'integer', 'label_ar' => 'أول يوم في الأسبوع', 'description_ar' => 'أول يوم في الأسبوع (6=السبت، 0=الأحد، 1=الإثنين)'],
            ['group' => 'general', 'key' => 'pagination_size', 'value' => '25', 'type' => 'integer', 'label_ar' => 'عدد العناصر في الصفحة', 'description_ar' => 'عدد العناصر في كل صفحة'],
            ['group' => 'general', 'key' => 'session_timeout_minutes', 'value' => '120', 'type' => 'integer', 'label_ar' => 'مهلة انتهاء الجلسة (دقائق)', 'description_ar' => 'مهلة انتهاء الجلسة بالدقائق'],

            // Financial
            ['group' => 'financial', 'key' => 'currency_code', 'value' => 'EGP', 'type' => 'string', 'label_ar' => 'رمز العملة', 'description_ar' => 'رمز العملة (EGP, SAR, AED)'],
            ['group' => 'financial', 'key' => 'currency_symbol', 'value' => 'ج.م', 'type' => 'string', 'label_ar' => 'رمز العملة للعرض', 'description_ar' => 'رمز العملة للعرض'],
            ['group' => 'financial', 'key' => 'tax_enabled', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'تفعيل الضريبة', 'description_ar' => 'تفعيل الضريبة على الفواتير'],
            ['group' => 'financial', 'key' => 'tax_percentage', 'value' => '14', 'type' => 'float', 'label_ar' => 'نسبة الضريبة (%)', 'description_ar' => 'نسبة الضريبة المضافة (%)'],
            ['group' => 'financial', 'key' => 'tax_registration_number', 'value' => '', 'type' => 'string', 'label_ar' => 'رقم التسجيل الضريبي', 'description_ar' => 'رقم التسجيل الضريبي'],
            ['group' => 'financial', 'key' => 'invoice_prefix', 'value' => 'INV', 'type' => 'string', 'label_ar' => 'بادئة رقم الفاتورة', 'description_ar' => 'بادئة رقم الفاتورة'],
            ['group' => 'financial', 'key' => 'receipt_prefix', 'value' => 'RCP', 'type' => 'string', 'label_ar' => 'بادئة رقم الإيصال', 'description_ar' => 'بادئة رقم الإيصال'],
            ['group' => 'financial', 'key' => 'payment_due_days', 'value' => '7', 'type' => 'integer', 'label_ar' => 'أيام استحقاق الدفع', 'description_ar' => 'عدد أيام استحقاق الدفع بعد إصدار الفاتورة'],
            ['group' => 'financial', 'key' => 'max_discount_percent', 'value' => '50', 'type' => 'integer', 'label_ar' => 'الحد الأقصى للخصم (%)', 'description_ar' => 'الحد الأقصى لنسبة الخصم (%)'],
            ['group' => 'financial', 'key' => 'refund_requires_approval', 'value' => '1', 'type' => 'boolean', 'label_ar' => 'الاسترداد يتطلب موافقة', 'description_ar' => 'هل يتطلب الاسترداد موافقة مسبقة؟'],
            ['group' => 'financial', 'key' => 'refund_approval_threshold', 'value' => '50000', 'type' => 'integer', 'label_ar' => 'حد مبلغ الاسترداد (بالقرش)', 'description_ar' => 'حد مبلغ الاسترداد الذي يتطلب موافقة (بالقروش)'],
            ['group' => 'financial', 'key' => 'wallet_enabled', 'value' => '1', 'type' => 'boolean', 'label_ar' => 'تفعيل المحفظة', 'description_ar' => 'تفعيل نظام المحفظة الإلكترونية'],
            ['group' => 'financial', 'key' => 'installment_late_fee', 'value' => '500', 'type' => 'integer', 'label_ar' => 'غرامة تأخير الأقساط (بالقرش)', 'description_ar' => 'غرامة التأخير على الأقساط (بالقروش)'],
            ['group' => 'financial', 'key' => 'auto_overdue_after_days', 'value' => '3', 'type' => 'integer', 'label_ar' => 'أيام التحويل لمتأخرة', 'description_ar' => 'عدد الأيام بعد تاريخ الاستحقاق لتحويل الفاتورة لمتأخرة'],
            ['group' => 'financial', 'key' => 'platform_fee_customer_pays', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'العميل يدفع رسوم المنصة', 'description_ar' => 'رسوم المنصة يدفعها العميل (مفعّل: تُضاف للإجمالي — معطّل: تُخصم من إيراد الأكاديمية)'],

            // Attendance
            ['group' => 'attendance', 'key' => 'participant_grace_period_minutes', 'value' => '15', 'type' => 'integer', 'label_ar' => 'فترة السماح للمشاركين (دقائق)', 'description_ar' => 'فترة السماح بالتأخير للمشاركين (بالدقائق)'],
            ['group' => 'attendance', 'key' => 'trainer_grace_period_minutes', 'value' => '10', 'type' => 'integer', 'label_ar' => 'فترة السماح للمدربين (دقائق)', 'description_ar' => 'فترة السماح بالتأخير للمدربين (بالدقائق)'],
            ['group' => 'attendance', 'key' => 'auto_absent_after_hours', 'value' => '2', 'type' => 'integer', 'label_ar' => 'ساعات الغياب التلقائي', 'description_ar' => 'ساعات بعد نهاية الحصة لتسجيل غياب تلقائي'],
            ['group' => 'attendance', 'key' => 'consecutive_absences_for_suspend', 'value' => '5', 'type' => 'integer', 'label_ar' => 'غيابات متتالية للإيقاف', 'description_ar' => 'عدد الغيابات المتتالية لإيقاف المشترك'],
            ['group' => 'attendance', 'key' => 'min_attendance_percent', 'value' => '75', 'type' => 'integer', 'label_ar' => 'الحد الأدنى لنسبة الحضور (%)', 'description_ar' => 'الحد الأدنى لنسبة الحضور (%)'],
            ['group' => 'attendance', 'key' => 'notify_guardian_on_absence', 'value' => '1', 'type' => 'boolean', 'label_ar' => 'إشعار ولي الأمر عند الغياب', 'description_ar' => 'إشعار ولي الأمر عند الغياب'],
            ['group' => 'attendance', 'key' => 'allow_excuse_after_hours', 'value' => '48', 'type' => 'integer', 'label_ar' => 'صلاحية تقديم عذر (ساعات)', 'description_ar' => 'مدة صلاحية تقديم عذر بعد الحصة (بالساعات)'],
            ['group' => 'attendance', 'key' => 'qr_check_in_enabled', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'حضور QR Code', 'description_ar' => 'تفعيل تسجيل الحضور بـ QR Code'],
            // New attendance settings
            ['group' => 'attendance', 'key' => 'trainer_attendance_tracking_enabled', 'value' => '1', 'type' => 'boolean', 'label_ar' => 'تتبع حضور المدربين', 'description_ar' => 'إنشاء سجلات حضور متوقعة للمدربين عند تعيينهم'],
            ['group' => 'attendance', 'key' => 'trainer_grace_minutes', 'value' => '10', 'type' => 'integer', 'label_ar' => 'فترة السماح للمدرب (دقائق)', 'description_ar' => 'عدد الدقائق المسموح بها قبل اعتبار المدرب متأخراً'],
            ['group' => 'attendance', 'key' => 'participant_grace_minutes', 'value' => '15', 'type' => 'integer', 'label_ar' => 'فترة السماح للمشترك (دقائق)', 'description_ar' => 'عدد الدقائق المسموح بها قبل اعتبار المشترك متأخراً'],
            ['group' => 'attendance', 'key' => 'early_leave_threshold_minutes', 'value' => '10', 'type' => 'integer', 'label_ar' => 'حد الانصراف المبكر (دقائق)', 'description_ar' => 'إذا غادر قبل نهاية الحصة بهذه المدة يُسجل كمنصرف مبكراً'],

            // Pricing
            ['group' => 'pricing', 'key' => 'global_max_discount', 'value' => '50', 'type' => 'integer', 'label_ar' => 'الحد الأقصى للخصم الكلي (%)', 'description_ar' => 'الحد الأقصى للخصم الكلي (%)'],
            ['group' => 'pricing', 'key' => 'allow_price_override', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'السماح بتجاوز السعر', 'description_ar' => 'السماح بتجاوز السعر يدوياً في نقطة البيع'],
            ['group' => 'pricing', 'key' => 'auto_apply_family_discount', 'value' => '1', 'type' => 'boolean', 'label_ar' => 'خصم العائلة التلقائي', 'description_ar' => 'تطبيق خصم العائلة تلقائياً'],
            ['group' => 'pricing', 'key' => 'family_discount_start_child', 'value' => '2', 'type' => 'integer', 'label_ar' => 'بداية خصم العائلة (الطفل رقم)', 'description_ar' => 'رقم الطفل الذي يبدأ عنده خصم العائلة'],
            ['group' => 'pricing', 'key' => 'trial_period_days', 'value' => '7', 'type' => 'integer', 'label_ar' => 'الفترة التجريبية (أيام)', 'description_ar' => 'مدة الفترة التجريبية (بالأيام)'],
            ['group' => 'pricing', 'key' => 'early_enrollment_days', 'value' => '14', 'type' => 'integer', 'label_ar' => 'أيام التسجيل المبكر', 'description_ar' => 'أيام التسجيل المبكر (للخصم)'],
            ['group' => 'pricing', 'key' => 'coupon_max_uses_default', 'value' => '100', 'type' => 'integer', 'label_ar' => 'الحد الافتراضي لاستخدام الكوبون', 'description_ar' => 'الحد الافتراضي لاستخدام الكوبون'],

            // Notifications
            ['group' => 'notifications', 'key' => 'email_enabled', 'value' => '1', 'type' => 'boolean', 'label_ar' => 'تفعيل البريد الإلكتروني', 'description_ar' => 'تفعيل إرسال البريد الإلكتروني'],
            ['group' => 'notifications', 'key' => 'sms_enabled', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'تفعيل الرسائل القصيرة', 'description_ar' => 'تفعيل إرسال الرسائل القصيرة'],
            ['group' => 'notifications', 'key' => 'sms_provider', 'value' => 'log', 'type' => 'string', 'label_ar' => 'مزود خدمة SMS', 'description_ar' => 'مزود خدمة SMS (log, twilio, vonage)'],
            ['group' => 'notifications', 'key' => 'sms_rate_limit_per_hour', 'value' => '100', 'type' => 'integer', 'label_ar' => 'حد الرسائل في الساعة', 'description_ar' => 'الحد الأقصى للرسائل في الساعة'],
            ['group' => 'notifications', 'key' => 'digest_mode_enabled', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'وضع الملخص اليومي', 'description_ar' => 'تفعيل وضع الملخص اليومي'],
            ['group' => 'notifications', 'key' => 'digest_send_time', 'value' => '08:00', 'type' => 'string', 'label_ar' => 'وقت إرسال الملخص', 'description_ar' => 'وقت إرسال الملخص اليومي'],
            ['group' => 'notifications', 'key' => 'notify_admin_on_payment', 'value' => '1', 'type' => 'boolean', 'label_ar' => 'إشعار المدير عند الدفع', 'description_ar' => 'إشعار المدير عند تسجيل دفعة'],
            ['group' => 'notifications', 'key' => 'notify_guardian_on_enrollment', 'value' => '1', 'type' => 'boolean', 'label_ar' => 'إشعار ولي الأمر عند التسجيل', 'description_ar' => 'إشعار ولي الأمر عند التسجيل'],
            ['group' => 'notifications', 'key' => 'payment_reminder_days_before', 'value' => '3', 'type' => 'integer', 'label_ar' => 'أيام تذكير الدفع', 'description_ar' => 'عدد أيام قبل الاستحقاق لإرسال تذكير الدفع'],

            // Enrollment
            ['group' => 'enrollment', 'key' => 'allow_waitlist', 'value' => '1', 'type' => 'boolean', 'label_ar' => 'تفعيل قائمة الانتظار', 'description_ar' => 'تفعيل قائمة الانتظار عند امتلاء المجموعة'],
            ['group' => 'enrollment', 'key' => 'auto_promote_waitlist', 'value' => '1', 'type' => 'boolean', 'label_ar' => 'ترقية الانتظار تلقائياً', 'description_ar' => 'ترقية المسجلين في قائمة الانتظار تلقائياً'],
            ['group' => 'enrollment', 'key' => 'require_medical_report', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'إلزام تقرير طبي', 'description_ar' => 'إلزام رفع تقرير طبي عند التسجيل'],
            ['group' => 'enrollment', 'key' => 'require_guardian_for_minors', 'value' => '1', 'type' => 'boolean', 'label_ar' => 'إلزام ولي أمر للقاصرين', 'description_ar' => 'إلزام ربط ولي أمر للقاصرين'],
            ['group' => 'enrollment', 'key' => 'minor_age_threshold', 'value' => '18', 'type' => 'integer', 'label_ar' => 'سن التسجيل بدون ولي أمر', 'description_ar' => 'السن الأدنى للتسجيل بدون ولي أمر'],
            ['group' => 'enrollment', 'key' => 'max_groups_per_participant', 'value' => '5', 'type' => 'integer', 'label_ar' => 'الحد الأقصى للمجموعات', 'description_ar' => 'الحد الأقصى لعدد المجموعات لكل مشترك'],
            ['group' => 'enrollment', 'key' => 'allow_transfer_between_groups', 'value' => '1', 'type' => 'boolean', 'label_ar' => 'السماح بالنقل بين المجموعات', 'description_ar' => 'السماح بنقل المشاركين بين المجموعات'],
            ['group' => 'enrollment', 'key' => 'freeze_max_days', 'value' => '30', 'type' => 'integer', 'label_ar' => 'أقصى مدة تجميد (أيام)', 'description_ar' => 'أقصى مدة تجميد الاشتراك (بالأيام)'],
            ['group' => 'enrollment', 'key' => 'freeze_max_times', 'value' => '2', 'type' => 'integer', 'label_ar' => 'أقصى مرات التجميد', 'description_ar' => 'أقصى عدد مرات التجميد في الاشتراك الواحد'],
            ['group' => 'enrollment', 'key' => 'enrollment_expiry_days', 'value' => '30', 'type' => 'integer', 'label_ar' => 'صلاحية الاشتراك (أيام)', 'description_ar' => 'مدة صلاحية الاشتراك الافتراضية (بالأيام)'],
            ['group' => 'enrollment', 'key' => 'require_documents_upload', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'تفعيل رفع المستندات', 'description_ar' => 'تفعيل نظام رفع المستندات (يسمح للمشتركين والموظفين برفع مستندات)'],
            ['group' => 'enrollment', 'key' => 'require_medical_certificate', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'إلزام شهادة طبية', 'description_ar' => 'إلزام رفع شهادة طبية سارية'],
            ['group' => 'enrollment', 'key' => 'medical_certificate_expiry_required', 'value' => '1', 'type' => 'boolean', 'label_ar' => 'إلزام تاريخ انتهاء الشهادة', 'description_ar' => 'إلزام إدخال تاريخ انتهاء الشهادة الطبية عند الموافقة'],
            ['group' => 'enrollment', 'key' => 'medical_certificate_max_age_months', 'value' => '12', 'type' => 'integer', 'label_ar' => 'صلاحية الشهادة الطبية (أشهر)', 'description_ar' => 'أقصى مدة صلاحية الشهادة الطبية بالأشهر'],
            ['group' => 'enrollment', 'key' => 'block_attendance_without_medical', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'منع الحضور بدون شهادة', 'description_ar' => 'منع تسجيل الحضور بدون شهادة طبية سارية'],
            ['group' => 'enrollment', 'key' => 'allowed_document_types', 'value' => '["birth_certificate","national_id","medical_certificate","passport","photo","contract","qualification","insurance","other"]', 'type' => 'json', 'label_ar' => 'أنواع المستندات المسموحة', 'description_ar' => 'أنواع المستندات المسموح رفعها'],
            ['group' => 'enrollment', 'key' => 'max_document_size_mb', 'value' => '10', 'type' => 'integer', 'label_ar' => 'حد حجم الملف (ميجابايت)', 'description_ar' => 'الحد الأقصى لحجم الملف المرفوع (ميجابايت)'],
            // New enrollment settings
            ['group' => 'enrollment', 'key' => 'auto_invoice_on_enrollment', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'إنشاء فاتورة تلقائياً عند التسجيل', 'description_ar' => 'إنشاء فاتورة للمشترك تلقائياً عند تسجيله في برنامج'],
            ['group' => 'enrollment', 'key' => 'auto_create_groups_enabled', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'إنشاء مجموعات تلقائياً', 'description_ar' => 'إنشاء مجموعة جديدة تلقائياً إذا كانت المجموعات الحالية ممتلئة'],
            ['group' => 'enrollment', 'key' => 'auto_enrollment_on_pos_purchase', 'value' => '1', 'type' => 'boolean', 'label_ar' => 'تسجيل تلقائي عند الشراء', 'description_ar' => 'تسجيل المشترك في البرنامج تلقائياً عند شرائه من نقطة البيع'],

            // Inventory
            ['group' => 'inventory', 'key' => 'auto_inventory_deduction_on_sale', 'value' => '1', 'type' => 'boolean', 'label_ar' => 'خصم المخزون تلقائياً عند البيع', 'description_ar' => 'خصم الكمية من المخزون تلقائياً عند إتمام عملية بيع'],
            ['group' => 'inventory', 'key' => 'auto_receive_inventory_enabled', 'value' => '1', 'type' => 'boolean', 'label_ar' => 'استلام المخزون تلقائياً', 'description_ar' => 'إنشاء حركات مخزنية تلقائياً عند تأكيد أمر الشراء'],

            // Payroll & Compensation
            ['group' => 'payroll', 'key' => 'payroll_enabled', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'تفعيل نظام الرواتب', 'description_ar' => 'تفعيل حساب الرواتب وكشوف المرتبات'],
            ['group' => 'payroll', 'key' => 'auto_trainer_compensation_enabled', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'الاحتساب التلقائي لأجور المدربين', 'description_ar' => 'احتساب أجر المدرب تلقائياً عند تسجيل حضوره'],
            ['group' => 'payroll', 'key' => 'trainer_absence_penalty_enabled', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'تفعيل خصم الغياب', 'description_ar' => 'خصم مبلغ من المدرب عند الغياب بدون عذر'],
            ['group' => 'payroll', 'key' => 'absence_penalty_amount', 'value' => '0', 'type' => 'integer', 'label_ar' => 'مبلغ خصم الغياب (بالقرش)', 'description_ar' => 'المبلغ المخصوم عند كل غياب (بالقروش)'],
            ['group' => 'payroll', 'key' => 'trainer_late_penalty_enabled', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'تفعيل خصم التأخير', 'description_ar' => 'خصم مبلغ من المدرب عند التأخير'],
            ['group' => 'payroll', 'key' => 'late_penalty_amount', 'value' => '0', 'type' => 'integer', 'label_ar' => 'مبلغ خصم التأخير (بالقرش)', 'description_ar' => 'المبلغ المخصوم عند كل تأخير (بالقروش)'],
            ['group' => 'payroll', 'key' => 'cancelled_session_pay_enabled', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'تعويض الحصص الملغاة', 'description_ar' => 'دفع نسبة من أجر المدرب عند إلغاء حصة من الأكاديمية'],
            ['group' => 'payroll', 'key' => 'cancelled_session_pay_percent', 'value' => '0', 'type' => 'integer', 'label_ar' => 'نسبة تعويض الإلغاء (%)', 'description_ar' => 'النسبة المئوية من أجر الحصة التي يحصل عليها المدرب'],
            ['group' => 'payroll', 'key' => 'per_player_compensation_enabled', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'تفعيل الأجر حسب اللاعب', 'description_ar' => 'احتساب أجر إضافي للمدرب عن كل لاعب نشط'],
            ['group' => 'payroll', 'key' => 'revenue_share_enabled', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'تفعيل حصة الإيرادات', 'description_ar' => 'احتساب نسبة من إيرادات المجموعة كأجر للمدرب'],
            ['group' => 'payroll', 'key' => 'social_insurance_enabled', 'value' => '0', 'type' => 'boolean', 'label_ar' => 'تفعيل خصم التأمينات', 'description_ar' => 'خصم نسبة التأمينات الاجتماعية من الراتب'],
            ['group' => 'payroll', 'key' => 'social_insurance_percent', 'value' => '0', 'type' => 'integer', 'label_ar' => 'نسبة التأمينات (%)', 'description_ar' => 'النسبة المئوية للتأمينات المخصومة من الراتب الأساسي'],
            ['group' => 'payroll', 'key' => 'payroll_day', 'value' => '28', 'type' => 'integer', 'label_ar' => 'يوم صرف الرواتب', 'description_ar' => 'اليوم من الشهر الذي تبدأ فيه فترة الرواتب الجديدة'],
        ];

        foreach ($settings as $setting) {
            DB::table('system_settings')->updateOrInsert(
                ['academy_id' => $academyId, 'key' => $setting['key']],
                [
                    'academy_id' => $academyId,
                    'group' => $setting['group'],
                    'key' => $setting['key'],
                    'value' => $setting['value'],
                    'type' => $setting['type'],
                    'label_ar' => $setting['label_ar'],
                    'description_ar' => $setting['description_ar'],
                    'is_public' => false,
                    'created_at' => $now,
                    'updated_at' => $now,
                ]
            );
        }

        $this->command->info('Seeded ' . count($settings) . ' system settings across 8 groups.');
    }
}
