<?php

namespace App\Livewire\Admin\Forms;

use Livewire\Component;
use App\Models\Admin\Forms;
use App\Models\Admin\FormFields;
use Livewire\Attributes\Computed;
use App\Models\Admin\FormFieldTypes;

class Fields extends Component
{
    public $fields = [];
    public Forms $form;

    public function mount(Forms $form)
    {
        $this->form = $form;

        foreach ($form->formFields->sortBy('ordernum') as $field) {
            $this->fields[] = [
                'id' => $field->id,
                'name' => $field->name,
                'title' => $field->label,
                'type' => $field->field_type_id,
                'placeholder' => $field->placeholder,
                'required' => $field->is_required,
                'ordernum' => $field->ordernum,
            ];
        }
    }

    #[Computed()]
    public function fieldTypes()
    {
        return FormFieldTypes::all();
    }

    public function addField()
    {
        $this->fields[] = [
            'id' => null,
            'name' => '',
            'title' => '',
            'type' => '',
            'placeholder' => '',
            'required' => '',
            'ordernum' => count($this->fields),
        ];
    }

    public function removeField($index)
    {
        unset($this->fields[$index]);
        $this->fields = array_values($this->fields);
    }

    protected function rules()
    {
        return [
            'fields.*.name' => 'required|string',
            'fields.*.title' => 'required|string',
            'fields.*.type' => 'required|exists:form_field_types,id',
            'fields.*.required' => 'required|boolean',
        ];
    }

    protected function messages()
    {
        return [
            'fields.*.name.required' => 'Alan adı gereklidir.',
            'fields.*.title.required' => 'Alan başlığı gereklidir.',
            'fields.*.type.required' => 'Alan tipi gereklidir.',
            'fields.*.type.exists' => 'Geçerli bir alan tipi seçiniz.',
            'fields.*.required.required' => 'Zorunlu mu? alanı gereklidir.',
            'fields.*.required.boolean' => 'Zorunlu mu? alanı geçerli bir değer olmalıdır.',
        ];
    }

    public function save()
    {
        $this->validate();

        $currentFieldIds = $this->form->formFields->pluck('id')->toArray();

        $fieldIds = [];

        foreach ($this->fields as $index => $field) {
            if ($field['id']) {
                $formField = FormFields::find($field['id']);
                $formField->update([
                    'field_type_id' => $field['type'],
                    'name' => $field['name'],
                    'label' => $field['title'],
                    'description' => null,
                    'is_required' => $field['required'],
                    'default_value' => '',
                    'placeholder' => $field['placeholder'] ?? null,
                    'is_invisible' => 0,
                    'ordernum' => $index,
                ]);
                $fieldIds[] = $field['id'];
            } else {
                $newField = $this->form->formFields()->create([
                    'form_id' => $this->form->id,
                    'field_type_id' => $field['type'],
                    'name' => $field['name'],
                    'label' => $field['title'],
                    'description' => null,
                    'is_required' => $field['required'],
                    'default_value' => '',
                    'placeholder' => $field['placeholder'] ?? null,
                    'is_invisible' => 0,
                    'ordernum' => $index,
                ]);
                $fieldIds[] = $newField->id;
            }
        }

        $fieldsToDelete = array_diff($currentFieldIds, $fieldIds);
        FormFields::destroy($fieldsToDelete);

        $this->dispatch('showAlert', [
            'title' => 'Başarılı!', 'text' => 'Form alanları güncellendi.', 'icon' => 'success'
        ]);
    }

    public function updateOrder($orderedIds)
    {
        // foreach ($orderedIds as $item) {
        //     FormFields::find($item['value'])->update(['ordernum' => $item['order']]);
        // }

        // Kaydedilmemiş alan olup olmadığını kontrol et
        foreach ($this->fields as $field) {
            if (is_null($field['id'])) {
                $this->dispatch('showAlert', [
                    'title' => 'Hata!', 'text' => 'Lütfen önce tüm alanları kaydedin.', 'icon' => 'error'
                ]);
                return;
            }
        }

        // Sıralama işlemini gerçekleştir
        foreach ($orderedIds as $item) {
            $formField = FormFields::find($item['value']);
            if ($formField) {
                $formField->update(['ordernum' => $item['order']]);
            }
        }

        $this->fields = [];
        foreach ($this->form->formFields->sortBy('ordernum') as $field) {
            $this->fields[] = [
                'id' => $field->id,
                'name' => $field->name,
                'title' => $field->label,
                'type' => $field->field_type_id,
                'placeholder' => $field->placeholder,
                'required' => $field->is_required,
                'ordernum' => $field->ordernum,
            ];
        }

        $this->dispatch('showAlert', [
            'title' => 'Başarılı!', 'text' => 'Sıralama güncellendi.', 'icon' => 'success'
        ]);
    }

    public function render()
    {
        return view('livewire.admin.forms.fields');
    }
}
