<?php

namespace App\Filament\Resources\ReviewPackResource\Pages;

use App\Filament\Resources\ReviewPackResource;
use App\Models\ReviewPack;
use App\Services\ReviewPackService;
use App\Support\Auth\Capabilities;
use App\Support\Rbac\UiEnforcement;
use App\Support\ReviewPackStatus;
use Filament\Actions;
use Filament\Forms\Components\Toggle;
use Filament\Resources\Pages\ViewRecord;
use Filament\Schemas\Components\Section;

class ViewReviewPack extends ViewRecord
{
    protected static string $resource = ReviewPackResource::class;

    protected function getHeaderActions(): array
    {
        if (ReviewPackResource::isCustomerWorkspaceFlow()) {
            return [
                Actions\Action::make('download')
                    ->label('Download')
                    ->icon('heroicon-o-arrow-down-tray')
                    ->color('primary')
                    ->visible(fn (): bool => $this->record->status === ReviewPackStatus::Ready->value)
                    ->url(fn (): string => app(ReviewPackService::class)->generateDownloadUrl($this->record, [
                        'source_surface' => \App\Filament\Pages\Reviews\CustomerReviewWorkspace::SOURCE_SURFACE,
                    ]))
                    ->openUrlInNewTab(),
            ];
        }

        $regenerateAction = UiEnforcement::forAction(
            Actions\Action::make('regenerate')
                ->label('Regenerate')
                ->icon('heroicon-o-arrow-path')
                ->color('primary')
                ->disabled(fn (): bool => ReviewPackResource::reviewPackGenerationBlocked($this->record->tenant))
                ->requiresConfirmation()
                ->modalDescription('This will generate a new review pack with the same options. The current pack will remain available until it expires.')
                ->action(function (array $data): void {
                    /** @var ReviewPack $record */
                    $record = $this->record;

                    $options = array_merge($record->options ?? [], [
                        'include_pii' => (bool) ($data['include_pii'] ?? ($record->options['include_pii'] ?? true)),
                        'include_operations' => (bool) ($data['include_operations'] ?? ($record->options['include_operations'] ?? true)),
                    ]);

                    ReviewPackResource::executeGeneration($options);
                })
                ->form(function (): array {
                    /** @var ReviewPack $record */
                    $record = $this->record;
                    $currentOptions = $record->options ?? [];

                    return [
                        Section::make('Pack options')
                            ->schema([
                                Toggle::make('include_pii')
                                    ->label('Include PII')
                                    ->helperText('Include personally identifiable information in the export.')
                                    ->default((bool) ($currentOptions['include_pii'] ?? true)),
                                Toggle::make('include_operations')
                                    ->label('Include operations')
                                    ->helperText('Include recent operation history in the export.')
                                    ->default((bool) ($currentOptions['include_operations'] ?? true)),
                            ]),
                    ];
                })
        )
            ->requireCapability(Capabilities::REVIEW_PACK_MANAGE)
            ->preserveDisabled()
            ->apply();

        $regenerateAction->tooltip(fn (): ?string => ReviewPackResource::reviewPackGenerationActionTooltip($this->record->tenant));

        return [
            Actions\Action::make('download')
                ->label('Download')
                ->icon('heroicon-o-arrow-down-tray')
                ->color('success')
                ->visible(fn (): bool => $this->record->status === ReviewPackStatus::Ready->value)
                ->url(fn (): string => app(ReviewPackService::class)->generateDownloadUrl($this->record))
                ->openUrlInNewTab(),

            $regenerateAction,
        ];
    }
}
