<?php

namespace App\Filament\Pages;

use App\Models\Company;
use App\Models\Contract;
use App\Models\ExecutionSummaryLine;
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 ContractVarianceReport extends Page implements HasForms
{
    use InteractsWithForms;
    use HasPageShield;

    protected string $view = 'filament.pages.contract-variance-report';

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

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

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

    public function mount(): void
    {
        $this->form->fill([
            'company_id' => null,
            'contract_id' => 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/contract_variance_report.فلاترالتقرير'))
                    ->columns(4)
                    ->schema([
                        Select::make('company_id')
                            ->label(__('filament/admin/contract_variance_report.العميل'))
                            ->options(fn () => Company::query()->where('is_active', true)->pluck('name', 'id')->toArray())
                            ->searchable()
                            ->preload()
                            ->reactive()
                            ->afterStateUpdated(fn ($set) => $set('contract_id', null)),

                        Select::make('contract_id')
                            ->label(__('filament/admin/contract_variance_report.العقد'))
                            ->options(function (callable $get) {
                                $companyId = $get('company_id');
                                if (!$companyId) {
                                    return Contract::query()->pluck('contract_no', 'id')->toArray();
                                }
                                return Contract::query()
                                    ->where('company_id', $companyId)
                                    ->pluck('contract_no', 'id')
                                    ->toArray();
                            })
                            ->searchable()
                            ->preload(),

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

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

    public function generateReport(): void
    {
        $companyId = $this->data['company_id'] ?? null;
        $contractId = $this->data['contract_id'] ?? null;
        $fromDate = $this->data['from_date'] ?? null;
        $toDate = $this->data['to_date'] ?? null;

        $contractsQuery = Contract::query()
            ->with(['company', 'contractItems.service']);

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

        if ($contractId) {
            $contractsQuery->where('id', $contractId);
        }

        $contracts = $contractsQuery->get();

        $this->rows = [];

        foreach ($contracts as $contract) {
            foreach ($contract->contractItems as $contractItem) {
                // حساب الكمية المنفذة من execution_summary_lines
                $executedQuery = ExecutionSummaryLine::query()
                    ->where('contract_item_id', $contractItem->id)
                    ->whereHas('executionSummary', function ($query) use ($fromDate, $toDate) {
                        if ($fromDate) {
                            $query->whereDate('period_from', '>=', $fromDate);
                        }
                        if ($toDate) {
                            $query->whereDate('period_to', '<=', $toDate);
                        }
                    });

                $executedQty = (float) $executedQuery->sum('executed_qty');
                $executedAmount = (float) $executedQuery->sum('amount');

                $agreedQty = (float) ($contractItem->agreed_qty ?? 0);
                $unitPrice = (float) ($contractItem->unit_price ?? 0);
                $agreedAmount = $agreedQty * $unitPrice;

                $qtyVariance = $executedQty - $agreedQty;
                $amountVariance = $executedAmount - $agreedAmount;
                $completionPct = $agreedQty > 0 ? ($executedQty / $agreedQty) * 100 : 0;

                $this->rows[] = [
                    'contract_no' => $contract->contract_no,
                    'company' => $contract->company?->name ?? '-',
                    'service' => $contractItem->service?->name ?? '-',
                    'agreed_qty' => $agreedQty,
                    'executed_qty' => $executedQty,
                    'qty_variance' => $qtyVariance,
                    'unit_price' => $unitPrice,
                    'agreed_amount' => $agreedAmount,
                    'executed_amount' => $executedAmount,
                    'amount_variance' => $amountVariance,
                    'completion_pct' => $completionPct,
                    'status' => $this->getVarianceStatus($completionPct),
                ];
            }
        }

        // حساب الإجماليات
        $this->summary = [
            'total_items' => count($this->rows),
            'total_agreed' => array_sum(array_column($this->rows, 'agreed_amount')),
            'total_executed' => array_sum(array_column($this->rows, 'executed_amount')),
            'total_variance' => array_sum(array_column($this->rows, 'amount_variance')),
            'avg_completion' => count($this->rows) > 0 
                ? array_sum(array_column($this->rows, 'completion_pct')) / count($this->rows) 
                : 0,
        ];
    }

    private function getVarianceStatus(float $completionPct): string
    {
        if ($completionPct >= 100) {
            return 'مكتمل';
        } elseif ($completionPct >= 80) {
            return 'جيد';
        } elseif ($completionPct >= 50) {
            return 'متوسط';
        } elseif ($completionPct > 0) {
            return 'ضعيف';
        } else {
            return 'لم يبدأ';
        }
    }

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

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

}
