<?php

namespace App\Filament\Resources\PanelBoxValidationResource\Pages;

use App\Filament\Resources\PanelBoxValidationResource;
use App\Models\ProductCharacteristicsMaster;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
use Illuminate\Validation\ValidationException;

class CreatePanelBoxValidation extends CreateRecord {

    protected static string $resource = PanelBoxValidationResource::class;


    public $showChecklist = false;
    public $checklist;

    public $skipChecklistValidation = false;

    public bool $shouldSkipChecklist = false;

    public $existingRecords = [];

    protected $listeners = [
        'checklistUpdated' => 'setChecklist',
        'checklist-cancelled' => 'handleChecklistCancel',
        'checklist-saved' => 'checkListSaved',
    ];

    public function setChecklist($checklist)
    {
        $this->data['checklist'] = $checklist;
    }

    public function doCreate()
    {
        $this->create();
    }

    public function mount(): void
    {
        parent::mount();

        session()->forget([
            'last_selected_plant_id',
            'last_selected_line',
            'last_selected_production',
        ]);
    }

    public function handleChecklistCancel()
    {
        $this->skipChecklistValidation = true;
        $this->showChecklist = false;
    }

    protected function mutateFormDataBeforeCreate(array $data): array
    {
        // if ($this->shouldSkipChecklist) {
        //     return $data;
        // }

        if ($this->checkIfHasCharacteristics($data)) {
            $this->showChecklist = true;
            $this->halt();
        }
        else{
            \Filament\Notifications\Notification::make()
                ->title('Characteristics not found for the scanned item.')
                ->danger()
                ->send();
            $this->halt();
        }
    }

    protected function checkIfHasCharacteristics(array $data)
    {
        $plantId = $data['plant_id'] ?? null;
        $itemCode = $data['item_id'] ?? null;
        $lineId = $data['line_id'] ?? null;

        if (!$plantId || !$itemCode || !$lineId) {
            return false;
        }

        $item = \App\Models\Item::where('code', $itemCode)
            ->where('plant_id', $plantId)
            ->first();

        $categoryName = trim($item->category) ?? null;

        if (!$item) {
            $this->existingRecords = collect();
            return false;
        }

        $this->existingRecords = ProductCharacteristicsMaster::where('plant_id', $plantId)
            ->where('category', $categoryName)
            ->where('line_id', $lineId)
            ->orderBy('id', 'asc')
            ->get();

        return $this->existingRecords->isNotEmpty();
    }

    public function checkListSaved()
    {
        $this->showChecklist = false;

        $plantId = $this->data['plant_id'] ?? null;
        $lineId = $this->data['line_id'] ?? null;
        $productionOrder = $this->data['production_order'] ?? null;

        return redirect()->to(
            static::getResource()::getUrl('create', [
                'plant_id' => $this->data['plant_id'] ?? null,
                'line_id' => $this->data['line_id'] ?? null,
                'production_order' => $this->data['production_order'] ?? null,
            ])
        );
    }

    protected function beforeCreate(): void
    {
        $errors = [];

        if (!empty($this->data['validationError'])) {
            $errors['validationError'] = ['Fix the errors before submitting.'];
        }

        if (!empty($this->data['serialPanelError'])) {
            $errors['serialPanelError'] = ['Fix the errors before submitting.'];
        }

        if (!empty($this->data['packSlipPanelError'])) {
            $errors['packSlipPanelError'] = ['Fix the errors before submitting.'];
        }

        if (!empty($this->data['namePlatePanelError'])) {
            $errors['namePlatePanelError'] = ['Fix the errors before submitting.'];
        }

        //..name plate

        if (!empty($this->data['tubeStickerPanelError'])) {
            $errors['tubeStickerPanelError'] = ['Fix the errors before submitting.'];
        }

        if (!empty($this->data['warrantyCardPanelError'])) {
            $errors['warrantyCardPanelError'] = ['Fix the errors before submitting.'];
        }

        //..part validations

        if (!empty($this->data['part_validation1_error'])) {
            $errors['part_validation1_error'] = ['Fix the errors before submitting.'];
        }

        if (!empty($this->data['part_validation2_error'])) {
            $errors['part_validation2_error'] = ['Fix the errors before submitting.'];
        }

        if (!empty($this->data['part_validation3_error'])) {
            $errors['part_validation3_error'] = ['Fix the errors before submitting.'];
        }

        if (!empty($this->data['part_validation4_error'])) {
            $errors['part_validation4_error'] = ['Fix the errors before submitting.'];
        }

        if (!empty($this->data['part_validation5_error'])) {
            $errors['part_validation5_error'] = ['Fix the errors before submitting.'];
        }

        if (!empty($errors)) {
            throw ValidationException::withMessages($errors);
        }

        $this->checkExisting();

        $checklist = $this->data['data']['checklist'] ?? [];

        if (count($this->existingRecords) > 0){

            $this->showChecklist = true;
            $this->halt();
        }
        else{
            $this->showChecklist = false;
        }
    }

    public function checkExisting()
    {
        $plant_id = $this->data['plant_id'] ?? null;
        $item_code = $this->data['item_id'] ?? null;
        $line_id = $this->data['line_id'] ?? null;


        $item = \App\Models\Item::where('code', $item_code)->where('plant_id', $plant_id)->first();

        if (!$item) {
            $this->existingRecords = collect();
            return;
        }

        // $item_id = $item->id;
        $categoryName = trim($item->category) ?? null;

        $this->existingRecords = ProductCharacteristicsMaster::where('plant_id', $plant_id)
            ->where('category', $categoryName)
            ->where('line_id', $line_id)
            ->get();
    }

    protected function afterCreate(): void
    {
        // Get the value from the hidden field 'plant'
        $plant = $this->form->getState()['plant'] ?? null;
        $line = $this->form->getState()['line'] ?? null;
        $production = $this->form->getState()['production'] ?? null;

        // $this->skipChecklistValidation = false;
        // $this->showChecklist = false;
        // $this->checklist = [];

        // $this->form->fill();

        // reset checklist
        $this->checklist = [];

        $this->skipChecklistValidation = false;
        $this->showChecklist = false;

        $this->form->fill([]);

        $this->data = [];

        $this->resetValidation();
        $this->resetErrorBag();

        $this->form->fill([
            'plant_id' => null,
            'line_id' => null,
            'production_order' => null,
        ]);


        // $this->dispatch('focus-item-id');
        session()->flash('focus_item_id_after_redirect', true);
        logger('Focus flag set in session');

        if ($plant) {
            session(['last_selected_plant_id' => $plant]);
        }
        if ($line) {
            session(['last_selected_line' => $line]);
        }
        if ($production) {
            session(['last_selected_production' => $production]);
        }
    }

    protected function getRedirectUrl(): string
    {
        //return $this->getResource()::getUrl('create'); // Stay on Create Page after savin

        return $this->getResource()::getUrl('create', [
            'plant_id' => $this->data['plant_id'] ?? null,
            'line_id' => $this->data['line_id'] ?? null,
            'production_order' => $this->data['production_order'] ?? null,
        ]);
    }
}
