<?php

namespace App\Http\Controllers;

use App\Actions\Database\CreateBackup;
use App\Actions\Database\RestoreBackup;
use App\Actions\Database\RunBackup;
use App\Facades\Toast;
use App\Helpers\HtmxResponse;
use App\Models\Backup;
use App\Models\BackupFile;
use App\Models\Server;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class DatabaseBackupController extends Controller
{
    public function show(Server $server, Backup $backup): View
    {
        $this->authorize('manage', $server);

        return view('databases.backups', [
            'server' => $server,
            'databases' => $server->databases,
            'backup' => $backup,
            'files' => $backup->files()->orderByDesc('id')->simplePaginate(10),
        ]);
    }

    public function run(Server $server, Backup $backup): RedirectResponse
    {
        $this->authorize('manage', $server);

        app(RunBackup::class)->run($backup);

        Toast::success('Backup is running.');

        return back();
    }

    public function store(Server $server, Request $request): HtmxResponse
    {
        $this->authorize('manage', $server);

        app(CreateBackup::class)->create('database', $server, $request->input());

        Toast::success('Backup created successfully.');

        return htmx()->back();
    }

    public function destroy(Server $server, Backup $backup): RedirectResponse
    {
        $this->authorize('manage', $server);

        $backup->delete();

        Toast::success('Backup deleted successfully.');

        return back();
    }

    public function restore(Server $server, Backup $backup, BackupFile $backupFile, Request $request): HtmxResponse
    {
        $this->authorize('manage', $server);

        app(RestoreBackup::class)->restore($backupFile, $request->input());

        Toast::success('Backup restored successfully.');

        return htmx()->back();
    }

    public function destroyFile(Server $server, Backup $backup, BackupFile $backupFile): RedirectResponse
    {
        $this->authorize('manage', $server);

        $backupFile->delete();

        $backupFile
            ->backup
            ->storage
            ->provider()
            ->ssh($server)
            ->delete($backupFile->storagePath());

        Toast::success('Backup file deleted successfully.');

        return back();
    }
}