<?php

namespace App\Filament\Resources;

use App\Filament\Resources\EntraGroupSyncRunResource\Pages;
use App\Models\EntraGroupSyncRun;
use App\Models\Tenant;
use App\Support\Badges\BadgeDomain;
use App\Support\Badges\BadgeRenderer;
use App\Support\OperationRunLinks;
use BackedEnum;
use Filament\Actions;
use Filament\Infolists\Components\TextEntry;
use Filament\Infolists\Components\ViewEntry;
use Filament\Resources\Resource;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use UnitEnum;

class EntraGroupSyncRunResource extends Resource
{
    protected static bool $isScopedToTenant = false;

    protected static ?string $model = EntraGroupSyncRun::class;

    protected static bool $shouldRegisterNavigation = false;

    protected static string|BackedEnum|null $navigationIcon = 'heroicon-o-user-group';

    protected static string|UnitEnum|null $navigationGroup = 'Directory';

    protected static ?string $navigationLabel = 'Group Sync Runs';

    public static function form(Schema $schema): Schema
    {
        return $schema;
    }

    public static function infolist(Schema $schema): Schema
    {
        return $schema
            ->schema([
                Section::make('Legacy run view')
                    ->description('Canonical monitoring is now available in Monitoring → Operations.')
                    ->schema([
                        TextEntry::make('canonical_view')
                            ->label('Canonical view')
                            ->state('View in Operations')
                            ->url(fn (EntraGroupSyncRun $record): string => OperationRunLinks::index(Tenant::current() ?? $record->tenant))
                            ->badge()
                            ->color('primary'),
                    ])
                    ->columnSpanFull(),

                Section::make('Sync Run')
                    ->schema([
                        TextEntry::make('initiator.name')
                            ->label('Initiator')
                            ->placeholder('—'),
                        TextEntry::make('status')
                            ->badge()
                            ->formatStateUsing(BadgeRenderer::label(BadgeDomain::EntraGroupSyncRunStatus))
                            ->color(BadgeRenderer::color(BadgeDomain::EntraGroupSyncRunStatus))
                            ->icon(BadgeRenderer::icon(BadgeDomain::EntraGroupSyncRunStatus))
                            ->iconColor(BadgeRenderer::iconColor(BadgeDomain::EntraGroupSyncRunStatus)),
                        TextEntry::make('selection_key')->label('Selection'),
                        TextEntry::make('slot_key')->label('Slot')->placeholder('—')->copyable(),
                        TextEntry::make('started_at')->dateTime(),
                        TextEntry::make('finished_at')->dateTime(),
                        TextEntry::make('pages_fetched')->label('Pages')->numeric(),
                        TextEntry::make('items_observed_count')->label('Observed')->numeric(),
                        TextEntry::make('items_upserted_count')->label('Upserted')->numeric(),
                        TextEntry::make('error_count')->label('Errors')->numeric(),
                        TextEntry::make('safety_stop_triggered')->label('Safety stop')->badge(),
                        TextEntry::make('safety_stop_reason')->label('Stop reason')->placeholder('—'),
                    ])
                    ->columns(2)
                    ->columnSpanFull(),

                Section::make('Error Summary')
                    ->schema([
                        TextEntry::make('error_code')->placeholder('—'),
                        TextEntry::make('error_category')->placeholder('—'),
                        ViewEntry::make('error_summary')
                            ->label('Safe error summary')
                            ->view('filament.infolists.entries.snapshot-json')
                            ->state(fn (EntraGroupSyncRun $record) => $record->error_summary ? ['summary' => $record->error_summary] : [])
                            ->columnSpanFull(),
                    ])
                    ->columns(2)
                    ->columnSpanFull(),
            ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->defaultSort('id', 'desc')
            ->modifyQueryUsing(function (Builder $query): Builder {
                $tenantId = Tenant::current()?->getKey();

                return $query->when($tenantId, fn (Builder $q) => $q->where('tenant_id', $tenantId));
            })
            ->columns([
                Tables\Columns\TextColumn::make('initiator.name')
                    ->label('Initiator')
                    ->placeholder('—')
                    ->toggleable(),
                Tables\Columns\TextColumn::make('status')
                    ->badge()
                    ->formatStateUsing(BadgeRenderer::label(BadgeDomain::EntraGroupSyncRunStatus))
                    ->color(BadgeRenderer::color(BadgeDomain::EntraGroupSyncRunStatus))
                    ->icon(BadgeRenderer::icon(BadgeDomain::EntraGroupSyncRunStatus))
                    ->iconColor(BadgeRenderer::iconColor(BadgeDomain::EntraGroupSyncRunStatus)),
                Tables\Columns\TextColumn::make('selection_key')
                    ->label('Selection')
                    ->limit(24)
                    ->copyable(),
                Tables\Columns\TextColumn::make('slot_key')
                    ->label('Slot')
                    ->placeholder('—')
                    ->limit(16)
                    ->copyable(),
                Tables\Columns\TextColumn::make('started_at')->since(),
                Tables\Columns\TextColumn::make('finished_at')->since(),
                Tables\Columns\TextColumn::make('pages_fetched')->label('Pages')->numeric(),
                Tables\Columns\TextColumn::make('items_observed_count')->label('Observed')->numeric(),
                Tables\Columns\TextColumn::make('items_upserted_count')->label('Upserted')->numeric(),
                Tables\Columns\TextColumn::make('error_count')->label('Errors')->numeric(),
            ])
            ->actions([
                Actions\ViewAction::make(),
            ])
            ->bulkActions([]);
    }

    public static function getEloquentQuery(): Builder
    {
        return parent::getEloquentQuery()
            ->with('initiator')
            ->latest('id');
    }

    public static function getPages(): array
    {
        return [
            'index' => Pages\ListEntraGroupSyncRuns::route('/'),
            'view' => Pages\ViewEntraGroupSyncRun::route('/{record}'),
        ];
    }
}
