<?php

namespace App\Filament\Pages;

use App\Models\Company;
use App\Models\Machine;
use App\Models\Site;
use App\Models\WorkOrder;
use Filament\Pages\Page;
use Filament\Schemas\Schema;
use Filament\Forms\Components\Select;
use Filament\Forms\Contracts\HasForms;
use Filament\Schemas\Components\Section;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Concerns\InteractsWithForms;
use BezhanSalleh\FilamentShield\Traits\HasPageShield;
use Filament\Support\Icons\Heroicon;

class WorkOrdersReport extends Page implements HasForms
{
    use InteractsWithForms;
    use HasPageShield;

    protected string $view = 'filament.pages.work-orders-report';

    protected static string|\BackedEnum|null $navigationIcon = Heroicon::OutlinedClipboardDocumentList;
    protected static ?string $navigationLabel = null;
    protected static ?int $navigationSort = 1;

    public static function getNavigationGroup(): string|null
    {
        return __('filament/admin/work_orders_report.navigation_group');
    }

    public ?array $data = [];
    public array $rows = [];
    public array $summary = [];

    public function mount(): void
    {
        $this->form->fill([
            'company_id' => null,
            'site_id' => null,
            'machine_id' => null,
            'status' => null,
            'from_date' => now()->startOfMonth()->toDateString(),
            'to_date' => now()->endOfMonth()->toDateString(),
        ]);
    }

    public function form(Schema $schema): Schema
    {
        return $schema
            ->statePath('data')
            ->components([
                Section::make(__('filament/admin/work_orders_report.فلاترالتقرير'))
                    ->columns(3)
                    ->schema([
                        Select::make('company_id')
                            ->label(__('filament/admin/work_orders_report.العميل'))
                            ->options(fn () => Company::query()->where('is_active', true)->pluck('name', 'id')->toArray())
                            ->searchable()
                            ->preload()
                            ->reactive()
                            ->afterStateUpdated(fn ($set) => $set('site_id', null)),

                        Select::make('site_id')
                            ->label(__('filament/admin/work_orders_report.الموقع'))
                            ->options(function (callable $get) {
                                $companyId = $get('company_id');
                                if (!$companyId) {
                                    return Site::query()->where('is_active', true)->pluck('name', 'id')->toArray();
                                }
                                return Site::query()
                                    ->where('company_id', $companyId)
                                    ->where('is_active', true)
                                    ->pluck('name', 'id')
                                    ->toArray();
                            })
                            ->searchable()
                            ->preload(),

                        Select::make('machine_id')
                            ->label(__('filament/admin/work_orders_report.المعدة'))
                            ->options(fn () => Machine::query()->where('is_active', true)->pluck('name', 'id')->toArray())
                            ->searchable()
                            ->preload(),

                        Select::make('status')
                            ->label(__('filament/admin/work_orders_report.الحالة'))
                            ->options([
                                'draft' => 'مسودة',
                                'submitted' => 'مقدم',
                                'approved' => 'معتمد',
                                'rejected' => 'مرفوض',
                                'invoiced' => 'مفوتر',
                            ]),

                        DatePicker::make('from_date')
                            ->label(__('filament/admin/work_orders_report.منتاريخ'))
                            ->native(false)
                            ->required(),

                        DatePicker::make('to_date')
                            ->label(__('filament/admin/work_orders_report.إلىتاريخ'))
                            ->native(false)
                            ->required(),
                    ]),
            ]);
    }

    public function generateReport(): void
    {
        $companyId = $this->data['company_id'] ?? null;
        $siteId = $this->data['site_id'] ?? null;
        $machineId = $this->data['machine_id'] ?? null;
        $status = $this->data['status'] ?? null;
        $fromDate = $this->data['from_date'] ?? null;
        $toDate = $this->data['to_date'] ?? null;

        $query = WorkOrder::query()
            ->with(['company', 'site', 'machine', 'driver', 'workOrderLines.service']);

        if ($companyId) {
            $query->where('company_id', $companyId);
        }

        if ($siteId) {
            $query->where('site_id', $siteId);
        }

        if ($machineId) {
            $query->where('machine_id', $machineId);
        }

        if ($status) {
            $query->where('status', $status);
        }

        if ($fromDate) {
            $query->whereDate('order_date', '>=', $fromDate);
        }

        if ($toDate) {
            $query->whereDate('order_date', '<=', $toDate);
        }

        $workOrders = $query->orderBy('order_date', 'desc')->get();

        $this->rows = $workOrders->map(function (WorkOrder $workOrder): array {
            return [
                'order_no' => $workOrder->order_no,
                'order_date' => $workOrder->order_date?->format('Y-m-d') ?? '-',
                'company' => $workOrder->company?->name ?? '-',
                'site' => $workOrder->site?->name ?? '-',
                'machine' => $workOrder->machine?->name ?? '-',
                'driver' => $workOrder->driver?->name ?? '-',
                'status' => match($workOrder->status) {
                    'draft' => 'مسودة',
                    'submitted' => 'مقدم',
                    'approved' => 'معتمد',
                    'rejected' => 'مرفوض',
                    'invoiced' => 'مفوتر',
                    default => $workOrder->status
                },
                'total_qty' => (float) $workOrder->workOrderLines->sum('executed_qty'),
                'total_amount' => (float) $workOrder->workOrderLines->sum('amount'),
                'notes' => $workOrder->notes ?? '-',
            ];
        })->toArray();

        // حساب الإجماليات
        $this->summary = [
            'total_orders' => count($this->rows),
            'total_qty' => array_sum(array_column($this->rows, 'total_qty')),
            'total_amount' => array_sum(array_column($this->rows, 'total_amount')),
            'by_status' => $workOrders->groupBy('status')->map(fn($items) => $items->count())->toArray(),
        ];
    }

    public function getTitle(): string
    {
        return __('filament/admin/work_orders_report.title');
    }

    public static function canAccess(): bool
    {
        return auth()->check();
    }
    public static function getNavigationLabel(): string
    {
        return __('filament/admin/work_orders_report.navigation_label');
    }

}
