<?php

namespace App\Livewire\Programs;

use App\Domain\Identity\Models\Branch;
use App\Domain\Shared\Exceptions\DomainException;
use App\Domain\Training\Models\Activity;
use App\Domain\Training\Services\TrainingProgramService;
use Illuminate\Support\Facades\DB;
use Livewire\Attributes\Layout;
use Livewire\Attributes\Title;
use Livewire\Component;

#[Layout('layouts.app')]
#[Title('إنشاء برنامج تدريبي')]
class CreateProgramWizard extends Component
{
    public int $currentStep = 1;
    public int $totalSteps = 4;
    public bool $completed = false;

    // Step 1: Basic Info
    public string $nameAr = '';
    public string $name = '';
    public ?int $activityId = null;
    public ?int $branchId = null;
    public string $skillLevel = '';
    public string $ageMin = '';
    public string $ageMax = '';
    public string $gender = '';
    public string $descriptionAr = '';

    // Step 2: Schedule & Duration
    public string $sessionsPerWeek = '';
    public string $sessionDurationMinutes = '';
    public string $programDurationWeeks = '';
    public string $minParticipants = '';
    public string $maxParticipants = '';

    // Step 3: Pricing
    public string $basePrice = '';

    public function mount(): void
    {
        $this->authorize('programs.create');
    }

    public function getStepLabels(): array
    {
        return [
            1 => 'المعلومات الأساسية',
            2 => 'الجدول والمدة',
            3 => 'التسعير',
            4 => 'مراجعة',
        ];
    }

    public function rulesForStep(int $step): array
    {
        return match ($step) {
            1 => [
                'nameAr' => 'required|string|max:255',
                'activityId' => 'required|exists:activities,id',
                'branchId' => 'required|exists:branches,id',
                'skillLevel' => 'nullable|string|max:50',
                'ageMin' => 'nullable|integer|min:2|max:99',
                'ageMax' => 'nullable|integer|min:2|max:99|gte:ageMin',
                'gender' => 'nullable|in:male,female',
            ],
            2 => [
                'sessionsPerWeek' => 'required|integer|min:1|max:14',
                'sessionDurationMinutes' => 'required|integer|min:15|max:300',
                'programDurationWeeks' => 'required|integer|min:1|max:104',
                'minParticipants' => 'required|integer|min:1',
                'maxParticipants' => 'required|integer|min:1|gte:minParticipants',
            ],
            3 => [
                'basePrice' => 'required|numeric|min:0',
            ],
            default => [],
        };
    }

    public function messagesForStep(int $step): array
    {
        return match ($step) {
            1 => [
                'nameAr.required' => 'اسم البرنامج بالعربي مطلوب',
                'activityId.required' => 'يجب اختيار النشاط',
                'activityId.exists' => 'النشاط المختار غير موجود',
                'branchId.required' => 'يجب اختيار الفرع',
                'branchId.exists' => 'الفرع غير موجود',
                'ageMin.integer' => 'الحد الأدنى للعمر يجب أن يكون رقم صحيح',
                'ageMax.gte' => 'الحد الأقصى للعمر يجب أن يكون أكبر من أو يساوي الحد الأدنى',
                'gender.in' => 'قيمة الجنس غير صالحة',
            ],
            2 => [
                'sessionsPerWeek.required' => 'عدد الحصص في الأسبوع مطلوب',
                'sessionsPerWeek.integer' => 'عدد الحصص يجب أن يكون رقم صحيح',
                'sessionsPerWeek.min' => 'عدد الحصص يجب أن يكون حصة واحدة على الأقل',
                'sessionDurationMinutes.required' => 'مدة الحصة مطلوبة',
                'sessionDurationMinutes.integer' => 'مدة الحصة يجب أن تكون رقم صحيح',
                'sessionDurationMinutes.min' => 'مدة الحصة يجب أن تكون 15 دقيقة على الأقل',
                'programDurationWeeks.required' => 'مدة البرنامج مطلوبة',
                'programDurationWeeks.integer' => 'مدة البرنامج يجب أن تكون رقم صحيح',
                'minParticipants.required' => 'الحد الأدنى للمشتركين مطلوب',
                'maxParticipants.required' => 'الحد الأقصى للمشتركين مطلوب',
                'maxParticipants.gte' => 'الحد الأقصى يجب أن يكون أكبر من أو يساوي الحد الأدنى',
            ],
            3 => [
                'basePrice.required' => 'السعر الأساسي مطلوب',
                'basePrice.numeric' => 'السعر يجب أن يكون رقم',
                'basePrice.min' => 'السعر لا يمكن أن يكون سالب',
            ],
            default => [],
        };
    }

    public function nextStep(): void
    {
        $this->validate(
            $this->rulesForStep($this->currentStep),
            $this->messagesForStep($this->currentStep)
        );

        if ($this->currentStep < $this->totalSteps) {
            $this->currentStep++;
        }
    }

    public function previousStep(): void
    {
        if ($this->currentStep > 1) {
            $this->currentStep--;
        }
    }

    public function goToStep(int $step): void
    {
        if ($step < $this->currentStep) {
            $this->currentStep = $step;
        }
    }

    public function confirm(): void
    {
        try {
            DB::transaction(function () {
                $data = [
                    'academy_id' => app('current_academy')->id,
                    'name_ar' => $this->nameAr,
                    'name' => $this->name ?: null,
                    'activity_id' => $this->activityId,
                    'branch_id' => $this->branchId,
                    'skill_level' => $this->skillLevel ?: null,
                    'age_min' => $this->ageMin ?: null,
                    'age_max' => $this->ageMax ?: null,
                    'gender' => $this->gender ?: null,
                    'description_ar' => $this->descriptionAr ?: null,
                    'sessions_per_week' => (int) $this->sessionsPerWeek,
                    'session_duration_minutes' => (int) $this->sessionDurationMinutes,
                    'program_duration_weeks' => (int) $this->programDurationWeeks,
                    'min_participants' => (int) $this->minParticipants,
                    'max_participants' => (int) $this->maxParticipants,
                    'status' => 'active',
                ];

                app(TrainingProgramService::class)->create($data, auth()->user());
            });

            $this->completed = true;
            session()->flash('success', 'تم إنشاء البرنامج التدريبي بنجاح');
        } catch (DomainException $e) {
            session()->flash('error', $e->getMessage());
        }
    }

    public function render()
    {
        return view('livewire.programs.create-program-wizard', [
            'stepLabels' => $this->getStepLabels(),
            'activities' => Activity::orderBy('name_ar')->get(['id', 'name_ar', 'name']),
            'branches' => Branch::where('is_active', true)->orderBy('name_ar')->get(['id', 'name_ar']),
        ]);
    }
}
