<?php

namespace App\Livewire\Groups;

use App\Domain\Identity\Models\Branch;
use App\Domain\Training\Models\TrainingGroup;
use App\Domain\Training\Models\TrainingProgram;
use App\Domain\Training\Services\TrainingGroupService;
use App\Domain\Shared\Exceptions\DomainException;
use App\Models\User;
use Livewire\Attributes\Layout;
use Livewire\Attributes\Title;
use Livewire\Component;

#[Layout('layouts.app')]
#[Title('إدارة المجموعة')]
class GroupForm extends Component
{
    public ?TrainingGroup $group = null;
    public bool $editing = false;

    public ?int $program_id = null;
    public ?int $branch_id = null;
    public string $name = '';
    public string $name_ar = '';
    public string $code = '';
    public ?int $head_trainer_id = null;
    public int $max_capacity = 20;
    public string $season = '';
    public ?string $start_date = null;
    public ?string $end_date = null;
    public string $notes = '';

    public function mount(?TrainingGroup $group = null): void
    {
        if ($group && $group->exists) {
            $this->group = $group;
            $this->editing = true;
            $this->program_id = $group->training_program_id;
            $this->branch_id = $group->branch_id;
            $this->name = $group->name ?? '';
            $this->name_ar = $group->name_ar;
            $this->code = $group->code ?? '';
            $this->head_trainer_id = $group->head_trainer_id;
            $this->max_capacity = $group->max_capacity;
            $this->season = $group->season ?? '';
            $this->start_date = $group->start_date?->format('Y-m-d');
            $this->end_date = $group->end_date?->format('Y-m-d');
            $this->notes = $group->notes ?? '';
        }
    }

    public function updatedProgramId(): void
    {
        if ($this->program_id && !$this->editing) {
            $program = TrainingProgram::find($this->program_id);
            if ($program) {
                $this->max_capacity = $program->max_participants;
                $this->branch_id = $program->branch_id;
            }
        }
    }

    public function rules(): array
    {
        return [
            'program_id' => 'required|exists:training_programs,id',
            'branch_id' => 'nullable|exists:branches,id',
            'name' => 'required|string|max:255',
            'name_ar' => 'required|string|max:255',
            'code' => 'nullable|string|max:10',
            'head_trainer_id' => 'nullable|exists:users,id',
            'max_capacity' => 'required|integer|min:1|max:500',
            'season' => 'nullable|string|max:50',
            'start_date' => 'nullable|date',
            'end_date' => 'nullable|date|after_or_equal:start_date',
            'notes' => 'nullable|string|max:1000',
        ];
    }

    public function messages(): array
    {
        return [
            'program_id.required' => 'البرنامج مطلوب',
            'program_id.exists' => 'البرنامج المحدد غير موجود',
            'branch_id.exists' => 'الفرع المحدد غير موجود',
            'name.required' => 'اسم المجموعة بالإنجليزية مطلوب',
            'name.max' => 'اسم المجموعة بالإنجليزية يجب ألا يتجاوز 255 حرف',
            'name_ar.required' => 'اسم المجموعة بالعربية مطلوب',
            'name_ar.max' => 'اسم المجموعة بالعربية يجب ألا يتجاوز 255 حرف',
            'code.max' => 'الكود يجب ألا يتجاوز 50 حرف',
            'head_trainer_id.exists' => 'المدرب المحدد غير موجود',
            'max_capacity.required' => 'الحد الأقصى للسعة مطلوب',
            'max_capacity.min' => 'الحد الأقصى للسعة يجب أن يكون 1 على الأقل',
            'max_capacity.max' => 'الحد الأقصى للسعة يجب ألا يتجاوز 500',
            'end_date.after_or_equal' => 'تاريخ الانتهاء يجب أن يكون بعد تاريخ البداية',
            'notes.max' => 'الملاحظات يجب ألا تتجاوز 1000 حرف',
        ];
    }

    public function save(TrainingGroupService $service): void
    {
        $this->validate();

        try {
            $data = [
                'training_program_id' => $this->program_id,
                'branch_id' => $this->branch_id,
                'name' => $this->name,
                'name_ar' => $this->name_ar,
                'code' => $this->code ?: null,
                'head_trainer_id' => $this->head_trainer_id,
                'max_capacity' => $this->max_capacity,
                'season' => $this->season ?: null,
                'start_date' => $this->start_date ?: null,
                'end_date' => $this->end_date ?: null,
                'notes' => $this->notes ?: null,
            ];

            if ($this->editing) {
                $service->update($this->group, $data);
                session()->flash('success', __('تم تحديث المجموعة بنجاح'));
            } else {
                $service->create($data, auth()->user());
                session()->flash('success', __('تم إنشاء المجموعة بنجاح'));
            }

            $this->redirect(route('groups.list'), navigate: true);
        } catch (DomainException $e) {
            session()->flash('error', $e->getMessage());
        }
    }

    public function render()
    {
        return view('livewire.groups.group-form', [
            'programs' => TrainingProgram::orderBy('name_ar')->get(['id', 'name_ar']),
            'branches' => Branch::orderBy('name_ar')->get(['id', 'name_ar']),
            'trainers' => User::where('status', 'active')->orderBy('name_ar')->get(['id', 'name_ar', 'name']),
        ]);
    }
}
