<?php

declare(strict_types=1);

namespace App\Modules\Admin\Presentation\Controllers;

use App\Core\Auth;
use App\Core\Csrf;
use App\Core\DB;
use App\Core\Request;
use App\Core\Response;
use App\Modules\Admin\Application\Services\WipeDataService;
use RuntimeException;
use Throwable;

final class WipeDataController
{
    public function __construct(private ?WipeDataService $service = null)
    {
        $this->service ??= new WipeDataService(DB::pdo());
    }

    public function handle(): void
    {
        Auth::requireLogin();
        require_permission('admin.data.wipe');

        $mode = (string) Request::input('mode', 'full_reset');
        $mode = $mode === 'transactions' ? 'transactions' : 'full_reset';

        if (Request::isPost() && (string) Request::post('action', '') === 'wipe') {
            $this->handlePost($mode);
            return;
        }

        Response::view('pages/admin/wipe_data', [
            'default_mode' => $mode,
        ]);
    }

    private function handlePost(string $mode): void
    {
        try {
            Csrf::verify();

            $confirm = trim((string) Request::post('confirm', ''));
            if ($confirm !== 'RESET') {
                throw new RuntimeException('اكتب RESET للتأكيد');
            }

            $password = (string) Request::post('password', '');
            $userId = (int) (current_user_id() ?: 0);
            $result = $this->service->wipe($mode, $userId, $password);

            $errors = $result['errors'];
            if ($errors !== []) {
                Response::flash('warning', 'تم تنفيذ التفريغ مع ملاحظات على بعض الجداول: ' . implode(' | ', $errors));
            } else {
                Response::flash('success', $mode === 'full_reset'
                    ? 'تم تفريغ جميع بيانات البرنامج مع الإبقاء على بيانات الشركة والمستخدمين والصلاحيات والإعدادات.'
                    : 'تم تفريغ بيانات المعاملات فقط مع الإبقاء على التعريفات الأساسية.');
            }
        } catch (Throwable $e) {
            Response::flash('danger', $e->getMessage());
        }

        Response::redirect('/admin/wipe-data');
    }
}
