<?php

namespace App\Filament\Imports;

use App\Models\Plant;
use App\Models\User;
use App\Models\WorkGroupMaster;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Str;

class WorkGroupMasterImporter extends Importer
{
    protected static ?string $model = WorkGroupMaster::class;

    public static function getColumns(): array
    {
        return [
            ImportColumn::make('plant')
                ->requiredMapping()
                ->exampleHeader('Plant Code')
                ->example('1000')
                ->label('Plant Code')
                ->relationship(resolveUsing: 'code')
                ->rules(['required']),
            ImportColumn::make('name')
                ->requiredMapping()
                ->exampleHeader('Group Work Center')
                ->example('RMGCEABC')
                ->label('Group Work Center')
                ->rules(['required']),
            ImportColumn::make('description')
                ->requiredMapping()
                ->exampleHeader('Description')
                ->example('Testing Model 1')
                ->label('Description')
                ->rules(['required']),
            ImportColumn::make('operation_number')
                ->requiredMapping()
                ->exampleHeader('Operation Number')
                ->example('0020')
                ->label('Operation Number')
                ->rules(['required']),
            ImportColumn::make('created_by')
                ->requiredMapping()
                ->exampleHeader('Created By')
                ->example('Admin')
                ->label('Created By')
                ->rules(['required']),
        ];
    }

    public function resolveRecord(): ?WorkGroupMaster
    {
        // return WorkGroupMaster::firstOrNew([
        //     // Update existing records, matching them by `$this->data['column_name']`
        //     'email' => $this->data['email'],
        // ]);
        $warnMsg = [];
        $plantCod = $this->data['plant'];
        $createdBy = $this->data['created_by'];
        $groupWorkCenter = $this->data['name'];
        $desc = trim($this->data['description']);
        $opNo = $this->data['operation_number'];
        $plantId = null;

        if (! $plantCod || $plantCod == null || $plantCod == '') {
            $warnMsg[] = "Plant code can't be empty!";
        } elseif (Str::length($plantCod) < 4 || ! is_numeric($plantCod) || ! preg_match('/^[1-9]\d{3,}$/', $plantCod)) {
            $warnMsg[] = "Invalid plant code '{$plantCod}' found!";
        } else {
            $plant = Plant::where('code', $plantCod)->first();
            if (! $plant) {
                $warnMsg[] = "Plant code '{$plantCod}' not found!";
            } else {
                $plantId = $plant->id;
            }
        }

        if (Str::length($groupWorkCenter) <= 0) {  // || !ctype_alnum($desc)
            $warnMsg[] = 'Invalid group work center found!';
        }

        if (Str::length(trim($desc)) <= 0) {
            $warnMsg[] = 'Invalid description found!';
        }

        if (Str::length($desc) > 44) {
            $warnMsg[] = 'Description should be less than 44 digits.';
        }

        if (Str::length($opNo) <= 0) {
            $warnMsg[] = 'Invalid operation number found!';
        }

        if (! is_numeric($opNo)) {
            $warnMsg[] = 'Operation number must be numeric values only.';
        }

        $user = User::where('name', $createdBy)->first();
        if (! $user) {
            $warnMsg[] = "Operator ID '{$createdBy}' not found!";
        }

        if (! empty($warnMsg)) {
            throw new RowImportFailedException(implode(', ', $warnMsg));
        } else {
            // Check (plant_id, name)
            // $existingByName = WorkGroupMaster::where('plant_id', $plantId)
            //     ->where('name', $groupWorkCenter)
            //     ->first();

            // if ($existingByName) {
            //     throw new RowImportFailedException('Group work center already exists for this plant!');
            // }

            // Check (plant_id, operation_number)
            // $existingByOpNum = WorkGroupMaster::where('plant_id', $plantId)
            //     ->where('operation_number', $opNo)
            //     ->where('name', $groupWorkCenter)
            //     ->first();

            // if ($existingByOpNum) {
            //     throw new RowImportFailedException('Operation number already exists for this plant!');
            // }

            // Check (plant_id)
            $existingByOperator = WorkGroupMaster::whereNot('plant_id', $plantId)
                ->where('name', $groupWorkCenter)
                ->first();

            if ($existingByOperator) {
                throw new RowImportFailedException('Already group work center assigned to another plant!');
            }
        }

        WorkGroupMaster::updateOrCreate([
            'plant_id' => $plantId,
            'name' => $groupWorkCenter,
        ],
            [
                'description' => $desc,
                'operation_number' => $opNo,
                'created_by' => $createdBy,
            ]
        );

        return null;

        // return new WorkGroupMaster();
    }

    public static function getCompletedNotificationBody(Import $import): string
    {
        $body = 'Your work group master import has completed and '.number_format($import->successful_rows).' '.str('row')->plural($import->successful_rows).' imported.';

        if ($failedRowsCount = $import->getFailedRowsCount()) {
            $body .= ' '.number_format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to import.';
        }

        return $body;
    }
}
