<?php

namespace App\Livewire\Admin\Taxonomy;

use Livewire\Component;
use Livewire\Attributes\On;
use Livewire\WithPagination;
use App\Models\Admin\Taxonomy;
use Livewire\Attributes\Computed;

class Index extends Component
{
    use WithPagination;

    public $paginate = 25;

    public $selectedTaxonomyId = null;

    public function mount()
    {
        $this->selectedTaxonomyId = request()->get('id');
        $storedPaginate = session('paginate', $this->paginate);
        $this->paginate = $storedPaginate;
    }

    public function updatedPaginate($value)
    {
        session(['paginate' => $value]);
    }

    public function selectCategory($id)
    {
        $this->selectedTaxonomyId = $id;
        return $this->redirectRoute('admin.taxonomy.index', ['id' => $id]);
    }

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

        activity()->causedBy(auth()->id())->log('Kategori sıralaması güncellendi');

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

    #[Computed()]
    public function taxonomy()
    {
        if ($this->selectedTaxonomyId) {
            return Taxonomy::where('parent_id', $this->selectedTaxonomyId)->orderBy('ordernum')->paginate($this->paginate);
        }

        return Taxonomy::whereNull('parent_id')->orderBy('ordernum')->paginate($this->paginate);
    }

    #[Computed()]
    public function selectedTaxonomyName()
    {
        if ($this->selectedTaxonomyId) {
            $taxonomy = Taxonomy::find($this->selectedTaxonomyId);
            return $taxonomy ? $taxonomy->name : null;
        }
        return null;
    }

    public function deleteConfirm($id)
    {
        $this->dispatch('deleteTriggered', id: $id);
    }

    #[On('delete')]
    public function delete($id)
    {
        $taxonomy = Taxonomy::find($id);

        if ($taxonomy) {
            if ($taxonomy->products()->exists()) {
                $this->dispatch('showAlert', [
                    'title' => 'Başarısız!', 'text' => 'Bu kategori ile ilişkili ürünler var, silinemez.', 'icon' => 'error'
                ]);
                return;
            }

            if ($taxonomy->isDeletable) {
                $taxonomy->children()->delete();
                $taxonomy->delete();

                activity()->performedOn($taxonomy)->causedBy(auth()->id())->log('Kategori silindi');

                $this->dispatch('showAlert', [
                    'title' => 'Başarılı!', 'text' => 'Kategori başarıyla silindi.', 'icon' => 'success'
                ]);
            } else {
                $this->dispatch('showAlert', [
                    'title' => 'Başarısız!', 'text' => 'Bu kategori silinemez.', 'icon' => 'error'
                ]);
            }
        } else {
            $this->dispatch('showAlert', [
                'title' => 'Başarısız!', 'text' => 'Kategori bulunamadı.', 'icon' => 'error'
            ]);
        }
    }

    public function render()
    {
        return view('livewire.admin.taxonomy.index');
    }
}
