<?php

namespace App\Filament\Resources\QualityValidationResource\Pages;

use App\Filament\Resources\QualityValidationResource;
use App\Livewire\ProductionCheckList;
use App\Models\ProductCharacteristicsMaster;
use App\Models\ProductionCharacteristic;
use App\Models\QualityValidation;
use Filament\Actions;
use Filament\Forms\Components\Component;
use Filament\Resources\Pages\CreateRecord;
use Illuminate\Validation\ValidationException;
use Filament\Actions\Action;
use Filament\Notifications\Notification;

class CreateQualityValidation extends CreateRecord
{
    protected static string $resource = QualityValidationResource::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',
        // 'trigger-create' => 'doCreate',
    ];

    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();
        }

        return $data;
    }

    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)
            ->get();
    }

    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['pack_slip_motor_error'])) {
            $errors['pack_slip_motor_error'] = ['Fix the errors before submitting.'];
        }

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

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

        //..name plate

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

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

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

        //..tube sticker

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

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

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

        //..warranty
        if (!empty($this->data['warranty_card_error'])) {
            $errors['warranty_card_error'] = ['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,
        ]);
    }

}
