<?php

namespace App\Http\Controllers;

use App\Services\LegGovDiscoveryService;
use App\Services\LegGovMetricsService;
use App\Services\ServerMetricsService;
use App\Services\BackupMetricsService;

class DashboardController extends Controller
{
    public function index(
        LegGovDiscoveryService $discovery,
        LegGovMetricsService $metrics,
        ServerMetricsService $serverMetrics,
        BackupMetricsService $backupMetrics
    ) {
        $apps = array_map(
            function (array $app) use ($metrics, $backupMetrics) {
                $app = $metrics->enrich($app);
                $app['backup'] = $backupMetrics->forDatabase(
                    $app['database'] ?? null
                );

                return $app;
            },
            $discovery->discover()
        );

        $totals = [
            'instalacoes' => count($apps),
            'online' => count(array_filter(
                $apps,
                fn ($a) => $a['status'] === 'online'
            )),
            'usuarios' => array_sum(array_map(
                fn ($a) => (int) ($a['active_users'] ?? 0),
                $apps
            )),
            'laravel' => count(array_filter(
                $apps,
                fn ($a) => $a['type'] === 'laravel'
            )),
            'php' => count(array_filter(
                $apps,
                fn ($a) => $a['type'] === 'php'
            )),
        ];

        $server = $serverMetrics->get();

        $backup = [
            'files' => $backupMetrics->latestFilesBackup(),
            'run' => $backupMetrics->latestRun(),
        ];

        $totals['backups_ok'] = count(array_filter(
            $apps,
            fn ($a) => ($a['backup']['status'] ?? null) === 'ok'
        ));

        return view(
            'dashboard',
            compact('apps', 'totals', 'server', 'backup')
        );
    }

    public function backupHistory(
        string $database,
        BackupMetricsService $backupMetrics,
        LegGovDiscoveryService $discovery
    ) {
        $allowed = array_values(array_filter(array_map(
            fn (array $app) => $app['database'] ?? null,
            $discovery->discover()
        )));

        if (!in_array($database, $allowed, true)) {
            abort(404);
        }

        return response()->json([
            'database' => $database,
            'backups' => $backupMetrics->historyForDatabase($database),
        ]);
    }

    public function backupDownload(
        string $database,
        string $filename,
        BackupMetricsService $backupMetrics,
        LegGovDiscoveryService $discovery
    ) {
        $allowed = array_values(array_filter(array_map(
            fn (array $app) => $app['database'] ?? null,
            $discovery->discover()
        )));

        if (!in_array($database, $allowed, true)) {
            abort(404);
        }

        $path = $backupMetrics->resolveDatabaseBackup(
            $database,
            $filename
        );

        if ($path === null) {
            abort(404);
        }

        return response()->download(
            $path,
            basename($path),
            [
                'Content-Type' => 'application/gzip',
                'X-Content-Type-Options' => 'nosniff',
            ]
        );
    }
}
