<?php

namespace App\Filament\Pages;

use App\Models\Company;
use App\Models\Extract;
use Carbon\Carbon;
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 ExtractsSummaryReport extends Page implements HasForms
{
    use InteractsWithForms;
    use HasPageShield;

    protected string $view = 'filament.pages.extracts-summary-report';

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

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

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

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

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

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

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

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

        $query = Extract::query()
            ->with(['company', 'contract', 'lines', 'deductions']);

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

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

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

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

        $extracts = $query->orderBy('created_at', 'desc')->get();

        $this->rows = $extracts->map(function (Extract $extract): array {
            return [
                'extract_no' => $extract->extract_no,
                'company' => $extract->company?->name ?? '-',
                'contract' => $extract->contract?->contract_no ?? '-',
                'period_from' => $extract->period_from ? Carbon::parse($extract->period_from)->toDateString() : '-',
                'period_to' => $extract->period_to ? Carbon::parse($extract->period_to)->toDateString() : '-',
                'gross_amount' => (float) $extract->gross_amount,
                'deductions_amount' => (float) $extract->deductions_amount,
                'net_amount' => (float) $extract->net_amount,
                'status' => match($extract->status) {
                    'draft' => 'مسودة',
                    'submitted' => 'مقدم',
                    'approved' => 'معتمد',
                    'rejected' => 'مرفوض',
                    'invoiced' => 'مفوتر',
                    default => $extract->status
                },
                'revision_no' => $extract->revision_no ?? 1,
                'approved_at' => $extract->approved_at?->format('Y-m-d') ?? '-',
            ];
        })->toArray();

        // حساب الإجماليات
        $totalGross = array_sum(array_column($this->rows, 'gross_amount'));
        $totalDeductions = array_sum(array_column($this->rows, 'deductions_amount'));

        $this->summary = [
            'total_extracts' => count($this->rows),
            'total_gross' => $totalGross,
            'total_deductions' => $totalDeductions,
            'total_net' => array_sum(array_column($this->rows, 'net_amount')),
            'by_status' => $extracts->groupBy('status')->map(fn($items) => $items->count())->toArray(),
            'avg_deduction_pct' => $totalGross > 0
                ? (($totalDeductions / $totalGross) * 100)
                : 0,
        ];
    }

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

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

}
