<?php

namespace App\Livewire\Studio\Master;

use App\Livewire\Forms\Studio\Master\FormulaForm;
use App\Models\Bottle;
use App\Models\Formula as FormulaModel;
use App\Traits\WithAuthorization;
use App\Traits\WithCloseModal;
use App\Traits\WithConfirmation;
use App\Traits\WithToast;
use App\Traits\WithUpdatedData;
use Flux\Flux;
use Livewire\Attributes\On;
use Livewire\Attributes\Title;
use Livewire\Component;

#[Title('Rumus')]
class Formula extends Component
{
    use WithAuthorization, WithCloseModal, WithConfirmation, WithToast, WithUpdatedData;

    public FormulaForm $form;

    public array $formulas = [];

    public string $method = 'create';

    public string $modalTitle = '';

    public array $qualities = ['Premium', 'Super Premium', 'Murni'];

    public array $sizes = [];

    public function mount()
    {
        $this->formulas = FormulaModel::orderBy('size')->get()
            ->groupBy('size')
            ->map(function ($items) {
                return $items->map(fn ($item) => [
                    'hash' => $item->hash,
                    'quality' => $item->quality,
                    'volume' => $item->volume,
                ]);
            })->toArray();

        $this->sizes = Bottle::distinct()->orderBy('size')->pluck('size')->toArray();
    }

    #[On('modal:open')]
    public function openModal(string $method, string $modalTitle, ?string $id = null)
    {
        $this->resetValidation();
        $this->resetErrorBag();

        $this->method = $method;
        $this->modalTitle = $modalTitle;

        if ($id) {
            $this->form->setFormula(FormulaModel::byHashOrFail($id));
        }
    }

    public function create()
    {
        $this->canOrAbort('create formula');

        $formula = $this->form->store();

        // push new formula to array
        $size = $formula->size;
        $this->formulas[$size] ??= [];
        $this->formulas[$size][] = [
            'hash' => $formula->hash,
            'quality' => $formula->quality,
            'volume' => $formula->volume,
        ];

        $this->toast('Rumus berhasil ditambahkan.');

        Flux::modals()->close();
    }

    public function update()
    {
        $this->canOrAbort('update formula');

        $formula = $this->form->update();

        // update array formulas
        foreach ($this->formulas as $key => &$items) {
            $index = array_search($formula->hash, array_column($items, 'hash'));
            if ($index !== false) {
                $this->formulas[$key][$index] = [
                    'hash' => $formula->hash,
                    'quality' => $formula->quality,
                    'volume' => $formula->volume,
                ];
                break;
            }
        }
        unset($items);

        $this->toast('Rumus berhasil diperbarui.');

        Flux::modals()->close();
    }

    public function delete(FormulaModel $formula)
    {
        $formula->delete();

        // update array formulas
        $size = $formula->size;
        if (isset($this->formulas[$size])) {
            $this->formulas[$size] = array_values(array_filter(
                $this->formulas[$size],
                fn ($item) => $item['hash'] !== $formula->hash
            ));

            if (empty($this->formulas[$size])) {
                unset($this->formulas[$size]);
            }
        }

        $this->toast('Rumus berhasil dihapus.');

        Flux::modals()->close();
    }

    public function render()
    {
        return view('livewire.studio.master.formulas', [
            'pageTitle' => 'Rumus',
        ]);
    }
}
