<?php

namespace App\Filament\Pages;

use App\Exports\ReportArrayExport;
use App\Support\AccountingReportPdfBuilder;
use Filament\Pages\Page;
use App\Services\AccountingReportService;
use BezhanSalleh\FilamentShield\Traits\HasPageShield;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Schemas\Schema;
use Maatwebsite\Excel\Facades\Excel;

class BalanceSheetReport extends Page implements HasForms
{
    use InteractsWithForms, HasPageShield;

    protected static \BackedEnum|string|null $navigationIcon = 'heroicon-o-clipboard-document-list';

    protected string $view = 'filament.pages.balance-sheet-report';

    protected static string|\UnitEnum|null $navigationGroup = 'التقارير المحاسبية';

    protected static ?int $navigationSort = 3;

    public ?string $asOfDate = null;
    public array $reportData = [];

    protected AccountingReportService $reportService;

    public function boot(AccountingReportService $reportService): void
    {
        $this->reportService = $reportService;
    }

    public function mount(): void
    {
        $this->asOfDate = now()->toDateString();
        $this->form->fill(['as_of_date' => $this->asOfDate]);
        $this->loadReport();
    }

    public static function getNavigationLabel(): string
    {
        return __('filament/admin/custom.balance_sheet.navigation');
    }

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

    protected function getHeaderActions(): array
    {
        return [
            \Filament\Actions\Action::make('export_pdf')
                ->label(__('filament/admin/custom.actions.export_pdf'))
                ->icon('heroicon-o-document-arrow-down')
                ->action('exportPdf'),
            
            \Filament\Actions\Action::make('export_excel')
                ->label(__('filament/admin/custom.actions.export_excel'))
                ->icon('heroicon-o-table-cells')
                ->action('exportExcel'),
        ];
    }

    public function form(Schema $schema): Schema
    {
        return $schema
            ->components([
                DatePicker::make('as_of_date')
                    ->label(__('filament/admin/custom.balance_sheet.as_of_date'))
                    ->default(now())
                    ->required()
                    ->live()
                    ->afterStateUpdated(function ($state) {
                        $this->asOfDate = $state;
                        $this->loadReport();
                    }),
            ]);
    }

    public function loadReport(): void
    {
        $this->reportData = $this->reportService->balanceSheet($this->asOfDate);
    }

    public function exportPdf(): \Symfony\Component\HttpFoundation\StreamedResponse
    {
        $rows = [];

        foreach (($this->reportData['assets']['items'] ?? []) as $asset) {
            $rows[] = [__('filament/admin/custom.balance_sheet.asset'), $asset['code'] ?? '', $asset['name'] ?? '', number_format((float) ($asset['balance'] ?? 0), 2)];
        }

        foreach (($this->reportData['liabilities']['items'] ?? []) as $liability) {
            $rows[] = [__('filament/admin/custom.balance_sheet.liability'), $liability['code'] ?? '', $liability['name'] ?? '', number_format((float) ($liability['balance'] ?? 0), 2)];
        }

        foreach (($this->reportData['equity']['items'] ?? []) as $equity) {
            $rows[] = [__('filament/admin/custom.balance_sheet.equity'), $equity['code'] ?? '', $equity['name'] ?? '', number_format((float) ($equity['balance'] ?? 0), 2)];
        }

        return AccountingReportPdfBuilder::download(
            title: __('filament/admin/custom.balance_sheet.title'),
            subtitle: __('filament/admin/custom.balance_sheet.subtitle', ['date' => $this->asOfDate]),
            headings: [__('filament/admin/custom.balance_sheet.classification'), __('filament/admin/custom.balance_sheet.code'), __('filament/admin/custom.balance_sheet.account_name'), __('filament/admin/custom.balance_sheet.value')],
            rows: $rows,
            summary: [
                __('filament/admin/custom.balance_sheet.total_assets') => number_format((float) ($this->reportData['assets']['total'] ?? 0), 2),
                __('filament/admin/custom.balance_sheet.total_liabilities') => number_format((float) ($this->reportData['liabilities']['total'] ?? 0), 2),
                __('filament/admin/custom.balance_sheet.total_equity') => number_format((float) ($this->reportData['equity']['total'] ?? 0), 2),
                __('filament/admin/custom.balance_sheet.total_liabilities_and_equity') => number_format((float) ($this->reportData['total_liabilities_and_equity'] ?? 0), 2),
            ],
            fileName: sprintf('balance-sheet-%s.pdf', $this->asOfDate),
        );
    }

    public function exportExcel(): \Symfony\Component\HttpFoundation\StreamedResponse
    {
        $rows = [];

        foreach (($this->reportData['assets']['items'] ?? []) as $asset) {
            $rows[] = [__('filament/admin/custom.balance_sheet.asset'), $asset['code'] ?? '', $asset['name'] ?? '', (float) ($asset['balance'] ?? 0)];
        }

        foreach (($this->reportData['liabilities']['items'] ?? []) as $liability) {
            $rows[] = [__('filament/admin/custom.balance_sheet.liability'), $liability['code'] ?? '', $liability['name'] ?? '', (float) ($liability['balance'] ?? 0)];
        }

        foreach (($this->reportData['equity']['items'] ?? []) as $equity) {
            $rows[] = [__('filament/admin/custom.balance_sheet.equity'), $equity['code'] ?? '', $equity['name'] ?? '', (float) ($equity['balance'] ?? 0)];
        }

        $rows[] = [__('filament/admin/custom.balance_sheet.total_assets'), '', '', (float) ($this->reportData['assets']['total'] ?? 0)];
        $rows[] = [__('filament/admin/custom.balance_sheet.total_liabilities'), '', '', (float) ($this->reportData['liabilities']['total'] ?? 0)];
        $rows[] = [__('filament/admin/custom.balance_sheet.total_equity'), '', '', (float) ($this->reportData['equity']['total'] ?? 0)];

        $filename = sprintf('balance-sheet-%s.xlsx', $this->asOfDate);

        return response()->streamDownload(function () use ($rows) {
            echo Excel::raw(
                new ReportArrayExport(
                    headings: [__('filament/admin/custom.balance_sheet.classification'), __('filament/admin/custom.balance_sheet.code'), __('filament/admin/custom.balance_sheet.account_name'), __('filament/admin/custom.balance_sheet.value')],
                    rows: $rows,
                ),
                \Maatwebsite\Excel\Excel::XLSX,
            );
        }, $filename);
    }

    protected function getViewData(): array
    {
        return ['reportData' => $this->reportData];
    }
}
