<?php

namespace App\Filament\Resources\ProviderConnectionResource\Pages;

use App\Filament\Resources\ProviderConnectionResource;
use App\Models\Tenant;
use App\Models\User;
use App\Services\Intune\AuditLogger;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\CreateRecord;

class CreateProviderConnection extends CreateRecord
{
    protected static string $resource = ProviderConnectionResource::class;

    protected bool $shouldMakeDefault = false;

    protected function mutateFormDataBeforeCreate(array $data): array
    {
        $tenant = $this->currentTenant();

        if (! $tenant instanceof Tenant) {
            abort(404);
        }

        $this->shouldMakeDefault = (bool) ($data['is_default'] ?? false);

        return [
            'workspace_id' => (int) $tenant->workspace_id,
            'tenant_id' => $tenant->getKey(),
            'provider' => 'microsoft',
            'entra_tenant_id' => $data['entra_tenant_id'],
            'display_name' => $data['display_name'],
            'is_default' => false,
        ];
    }

    protected function afterCreate(): void
    {
        $tenant = $this->currentTenant();

        if (! $tenant instanceof Tenant) {
            abort(404);
        }

        $record = $this->getRecord();

        $user = auth()->user();
        $actorId = $user instanceof User ? (int) $user->getKey() : null;
        $actorEmail = $user instanceof User ? $user->email : null;
        $actorName = $user instanceof User ? $user->name : null;

        app(AuditLogger::class)->log(
            tenant: $tenant,
            action: 'provider_connection.created',
            context: [
                'metadata' => [
                    'provider' => $record->provider,
                    'entra_tenant_id' => $record->entra_tenant_id,
                ],
            ],
            actorId: $actorId,
            actorEmail: $actorEmail,
            actorName: $actorName,
            resourceType: 'provider_connection',
            resourceId: (string) $record->getKey(),
            status: 'success',
        );

        $hasDefault = $tenant->providerConnections()
            ->where('provider', $record->provider)
            ->where('is_default', true)
            ->exists();

        if ($this->shouldMakeDefault || ! $hasDefault) {
            $record->makeDefault();
        }

        Notification::make()
            ->title('Provider connection created')
            ->success()
            ->send();
    }

    private function currentTenant(): ?Tenant
    {
        $tenant = ProviderConnectionResource::resolveTenantForCreate();

        if ($tenant instanceof Tenant) {
            return $tenant;
        }

        return null;
    }
}
