<?php

declare(strict_types=1);

namespace App\Controllers\Admin;

use App\Core\Auth;
use App\Core\Request;
use App\Core\Response;
use App\Core\Session;
use App\Core\View;

/**
 * Compte administrateur : changement de mot de passe depuis l'admin (saisie navigateur = UTF-8).
 */
final class AccountController extends AdminController
{
    /** @param array<string,string> $params */
    public function edit(Request $request, array $params): Response
    {
        if ($r = $this->guard()) {
            return $r;
        }

        return Response::html(View::render('admin/account/index', [
            'pageTitle' => 'Mon compte',
            'flash'     => Session::pull('flash'),
            'errors'    => (array) Session::pull('account_errors'),
        ], 'layouts/admin'));
    }

    /** @param array<string,string> $params */
    public function updatePassword(Request $request, array $params): Response
    {
        if ($r = $this->guard()) {
            return $r;
        }
        if (!$this->csrfValid($request)) {
            return Response::redirect(base_url('admin/account'));
        }

        $current = (string) $request->input('current_password', '');
        $new     = (string) $request->input('new_password', '');
        $confirm = (string) $request->input('confirm_password', '');

        $errors = [];
        if (!Auth::verifyPassword($current)) {
            $errors[] = 'Mot de passe actuel incorrect.';
        }
        if (mb_strlen($new) < 8) {
            $errors[] = 'Le nouveau mot de passe doit faire au moins 8 caractères.';
        }
        if ($new !== $confirm) {
            $errors[] = 'La confirmation ne correspond pas au nouveau mot de passe.';
        }

        if ($errors === []) {
            Auth::setPassword($new);
            Session::set('flash', 'Mot de passe mis à jour.');
        } else {
            Session::set('account_errors', $errors);
        }

        return Response::redirect(base_url('admin/account'));
    }
}
