<?php

namespace App\Filament\Imports;

use App\Models\CheckPointName;
use App\Models\GuardName;
use App\Models\GuardPatrolEntry;
use App\Models\Plant;
use Carbon\Carbon;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Facades\Filament;
use Str;

class GuardPatrolEntryImporter extends Importer
{
    protected static ?string $model = GuardPatrolEntry::class;

    public static function getColumns(): array
    {
        return [
            ImportColumn::make('plant')
                ->requiredMapping()
                ->exampleHeader('Plant Name')
                ->example('Ransar Industries-I')
                ->label('Plant Name')
                ->relationship(resolveUsing: 'name')
                ->rules(['required']),
            ImportColumn::make('guardNames')
                ->requiredMapping()
                ->exampleHeader('Guard Name')
                ->example('ARUMUGAM - HG')
                ->label('Guard Name')
                ->relationship(resolveUsing: 'name')
                ->rules(['required']),
            ImportColumn::make('checkPointNames')
                ->requiredMapping()
                ->exampleHeader('Check Point Name')
                ->example('STP BACKSIDE')
                ->label('Check Point Name')
                ->relationship(resolveUsing: 'name')
                ->rules(['required']),
            // ImportColumn::make('reader_code')
            //     ->requiredMapping()
            //     ->exampleHeader('Reader Code')
            //     ->example('0C03-25010112')
            //     ->label('Reader Code'),
            ImportColumn::make('patrol_time')
                ->requiredMapping()
                ->exampleHeader('Patrol Time')
                ->example('01-01-2025 08:00:00')
                ->label('Patrol Time')
                ->rules(['required']),
            // ImportColumn::make('created_by')
            //     ->requiredMapping()
            //     ->exampleHeader('Created By')
            //     ->example(Filament::auth()->user()->name ?? 'Admin')
            //     ->label('Created By')
            //     ->rules(['required']),
            // ImportColumn::make('updated_by')
            //     ->requiredMapping()
            //     ->rules(['required']),
        ];
    }

    public function resolveRecord(): ?GuardPatrolEntry
    {
        $warnMsg = [];
        $plant = Plant::where('name', $this->data['plant'])->first();
        $guardNames = null;
        $checkPointNames = null;
        $patrolDateTime = null; //$fdateTime = null;
        if (!$plant) {
            $warnMsg[] = "Plant not found"; // '" . $this->data['plant'] . "'
        }
        else
        {
            $guardNames = GuardName::where('plant_id', $plant->id)->where('name', $this->data['guardNames'])->first();
            if (!$guardNames) {
                $warnMsg[] = "Guard name not found";
            }
            else
            {
                $checkPointNames = CheckPointName::where('plant_id', $plant->id)->where('name', $this->data['checkPointNames'])->first();
                if (!$checkPointNames) {
                    $warnMsg[] = "Check point name not found";
                }
                else
                {
                    $patrolTime = $this->data['patrol_time'];//$fromDate = $this->data['from_datetime'];
                    $formats = ['d-m-Y H:i', 'd-m-Y H:i:s']; //'07-05-2025 08:00' or '07-05-2025 08:00:00'

                    foreach ($formats as $format) {
                        try {
                            $patrolDateTime = Carbon::createFromFormat($format, $patrolTime);
                            break;
                        } catch (\Exception $e) {
                            // Optionally collect warning messages
                            // $warnMsg[] = "Date format mismatch with format: $format";
                        }
                    }

                    if (!isset($patrolDateTime)) {
                        // throw new \Exception('Invalid date time format');
                        $warnMsg[] = "Invalid 'Patrol DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
                    }
                    else
                    {
                        $guardEntryFound = GuardPatrolEntry::where('plant_id', $plant->id)->where('guard_name_id', $guardNames->id)->where('check_point_name_id', $checkPointNames->id)->where('patrol_time', $patrolDateTime->format('Y-m-d H:i:s'))->first();
                        if ($guardEntryFound) {
                            $warnMsg[] = "Duplicate guard patrol entry found";
                        }
                    }
                }
            }
        }

        $createdBy = Filament::auth()->user()->name;// ?? 'Admin'
        if (!$createdBy) {
            $warnMsg[] = "Invalid created by name found";
        }

        if (!empty($warnMsg)) {
            throw new RowImportFailedException(implode(', ', $warnMsg));
        }

        GuardPatrolEntry::updateOrCreate([
            'plant_id' => $plant->id,
            'guard_name_id' => $guardNames->id,
            'check_point_name_id' => $checkPointNames->id,
            'patrol_time' => $patrolDateTime->format('Y-m-d H:i:s')
        ],
        [
            'reader_code' => null,
            'created_by' => $createdBy,
            'updated_by' => $createdBy
            ]
        );
        return null;
        // // return GuardPatrolEntry::firstOrNew([
        // //     // Update existing records, matching them by `$this->data['column_name']`
        // //     'email' => $this->data['email'],
        // // ]);

        // return new GuardPatrolEntry();
    }

    public static function getCompletedNotificationBody(Import $import): string
    {
        $body = 'Your guard patrol entry 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;
    }
}
