<?php

namespace App\Filament\Pages\Accounting;

use App\Services\Accounting\Reports\IncomeStatementReport;
use Filament\Forms;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Pages\Page;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
use BezhanSalleh\FilamentShield\Traits\HasPageShield;
use Filament\Support\Icons\Heroicon;

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

    protected static string|\BackedEnum|null $navigationIcon = Heroicon::OutlinedDocumentChartBar;

    protected string $view = 'filament.pages.accounting.income-statement';

    protected static ?int $navigationSort = 11;

    public ?array $data = [];
    public ?array $reportData = null;

    public static function getNavigationGroup(): ?string
    {
        return __('models.Accounting');
    }

    public static function getNavigationLabel(): string
    {
        return __('filament/admin/income_statement.navigation_label');
    }

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

    public function mount(): void
    {
        $this->form->fill([
            'from_date' => now()->startOfMonth(),
            'to_date' => now(),
        ]);
    }

    public function form(Schema $schema): Schema
    {
        return $schema
            ->schema([
                Section::make(__('filament/admin/income_statement.معاملاتالتقرير'))
                    ->columns(2)
                    ->schema([
                        Forms\Components\DatePicker::make('from_date')
                            ->label(__('filament/admin/income_statement.منتاريخ'))
                            ->required()
                            ->native(false)
                            ->default(now()->startOfMonth()),

                        Forms\Components\DatePicker::make('to_date')
                            ->label(__('filament/admin/income_statement.إلىتاريخ'))
                            ->required()
                            ->native(false)
                            ->default(now()),
                    ]),
            ])
            ->statePath('data');
    }

    public function generateReport(): void
    {
        $data = $this->form->getState();

        try {
            $reportService = new IncomeStatementReport();
            $this->reportData = $reportService->generate(
                $data['from_date'],
                $data['to_date']
            );

            \Filament\Notifications\Notification::make()
                ->success()
                ->title(__('filament/admin/income_statement.تمإنشاءالتقرير'))
                ->body('تم إنشاء تقرير قائمة الدخل بنجاح')
                ->send();
        } catch (\Exception $e) {
            \Filament\Notifications\Notification::make()
                ->danger()
                ->title(__('filament/admin/income_statement.خطأ'))
                ->body($e->getMessage())
                ->send();
        }
    }

    public function exportPdf()
    {
        $data = $this->form->getState();

        try {
            $reportService = new IncomeStatementReport();
            $pdf = $reportService->exportPdf(
                $data['from_date'],
                $data['to_date']
            );

            return response()->streamDownload(function () use ($pdf) {
                echo $pdf;
            }, 'income-statement-' . now()->format('Y-m-d') . '.pdf');
        } catch (\Exception $e) {
            \Filament\Notifications\Notification::make()
                ->danger()
                ->title(__('filament/admin/income_statement.خطأ'))
                ->body($e->getMessage())
                ->send();
        }
    }

    protected function getFormActions(): array
    {
        return [
            \Filament\Actions\Action::make('generate')
                ->label(__('filament/admin/income_statement.generate'))
                ->action('generateReport')
                ->color('primary'),

            \Filament\Actions\Action::make('export_pdf')
                ->label(__('filament/admin/income_statement.export_pdf'))
                ->action('exportPdf')
                ->color('success')
                ->visible(fn () => $this->reportData !== null),
        ];
    }
}
