<?php

require_once BASE_PATH . '/app/controllers/admin/AdminBaseController.php';
require_once BASE_PATH . '/app/models/User.php';

class AdminUserController extends AdminBaseController
{
    private User $userModel;

    public function __construct()
    {
        parent::__construct();
        $this->requireAdmin();
        $this->userModel = new User();
    }

    public function index(): void
    {
        $search = trim($_GET['search'] ?? '');
        $role = trim($_GET['role'] ?? '');
        $status = trim($_GET['status'] ?? '');

        if (!in_array($role, ['', 'customer', 'owner', 'admin'], true)) {
            $role = '';
        }
        if (!in_array($status, ['', 'active', 'locked'], true)) {
            $status = '';
        }

        $page = max(1, (int) ($_GET['page'] ?? 1));
        $perPage = 20;
        $totalUsers = $this->userModel->countForAdmin($search, $role, $status);
        $totalPages = max(1, (int) ceil($totalUsers / $perPage));
        $page = min($page, $totalPages);
        $users = $this->userModel->getForAdmin(
            $search,
            $role,
            $status,
            $perPage,
            ($page - 1) * $perPage
        );

        require BASE_PATH . '/app/views/admin/users/index.php';
    }

    public function detail(): void
    {
        $userId = (int) ($_GET['id'] ?? 0);
        $user = $this->userModel->findForAdmin($userId);

        if (!$user) {
            http_response_code(404);
            require BASE_PATH . '/app/views/errors/404.php';
            return;
        }

        require BASE_PATH . '/app/views/admin/users/detail.php';
    }

    public function create(): void
    {
        $user = ['full_name' => '', 'phone' => '', 'email' => '', 'role' => 'customer', 'status' => 'active'];
        $isNew = true;
        require BASE_PATH . '/app/views/admin/users/form.php';
    }

    public function edit(): void
    {
        $user = $this->userModel->findForAdmin((int) ($_GET['id'] ?? 0));
        if (!$user || $user['role'] === 'admin') { http_response_code(404); require BASE_PATH . '/app/views/errors/404.php'; return; }
        $isNew = false;
        require BASE_PATH . '/app/views/admin/users/form.php';
    }

    public function save(): void
    {
        $this->requirePost(); $this->validateCsrf();
        $id = (int) ($_POST['user_id'] ?? 0); $isNew = $id < 1;
        $fullName = trim((string) ($_POST['full_name'] ?? '')); $phone = preg_replace('/[\s.\-]/', '', trim((string) ($_POST['phone'] ?? ''))); $email = strtolower(trim((string) ($_POST['email'] ?? '')));
        $role = (string) ($_POST['role'] ?? 'customer'); $status = (string) ($_POST['status'] ?? 'active'); $password = (string) ($_POST['password'] ?? '');
        if (mb_strlen($fullName) < 2 || !preg_match('/^0[0-9]{9}$/', $phone) || ($email !== '' && !filter_var($email, FILTER_VALIDATE_EMAIL)) || !in_array($role, ['customer', 'owner'], true) || !in_array($status, ['active', 'locked'], true) || ($isNew && strlen($password) < 8)) { $this->flashError('Vui lòng kiểm tra họ tên, số điện thoại, email, vai trò và mật khẩu (tối thiểu 8 ký tự).'); $this->redirect($isNew ? 'admin/user/create' : 'admin/user/edit', $isNew ? [] : ['id' => $id]); }
        $phoneUser = $this->userModel->findByIdentifier($phone); $emailUser = $email === '' ? null : $this->userModel->findByEmail($email);
        if (($phoneUser && (int) $phoneUser['id'] !== $id) || ($emailUser && (int) $emailUser['id'] !== $id)) { $this->flashError('Email hoặc số điện thoại đã được sử dụng.'); $this->redirect($isNew ? 'admin/user/create' : 'admin/user/edit', $isNew ? [] : ['id' => $id]); }
        $data = ['full_name' => $fullName, 'phone' => $phone, 'email' => $email ?: null, 'role' => $role, 'status' => $status];
        if ($password !== '') { if (strlen($password) < 8) { $this->flashError('Mật khẩu tối thiểu 8 ký tự.'); $this->redirect('admin/user/edit', ['id' => $id]); } $data['password_hash'] = password_hash($password, PASSWORD_DEFAULT); }
        if ($isNew) { $data['password_hash'] = password_hash($password, PASSWORD_DEFAULT); $newId = 0; $this->mutateAndLog(function () use (&$newId, $data): void { $newId = $this->userModel->createByAdmin($data); }, 'admin.user.create', 'user', null, ['role' => $role], true); $this->flashSuccess('Đã thêm người dùng.'); $this->redirect('admin/user', ['id' => $newId]); }
        $target = $this->userModel->findForAdmin($id); if (!$target || $target['role'] === 'admin') { $this->flashError('Không thể sửa tài khoản này.'); $this->redirect('admin/users'); }
        $this->mutateAndLog(fn () => $this->userModel->updateByAdmin($id, $data), 'admin.user.update', 'user', $id, ['role' => $role, 'status' => $status], true); $this->flashSuccess('Đã cập nhật người dùng.'); $this->redirect('admin/user', ['id' => $id]);
    }

    public function updateStatus(): void
    {
        $this->requirePost();
        $this->validateCsrf();

        $targetId = (int) ($_POST['user_id'] ?? 0);
        $newStatus = trim($_POST['status'] ?? '');
        $target = $this->userModel->findForAdmin($targetId);

        if (!$target || !in_array($newStatus, ['active', 'locked'], true)) {
            $this->flashError('Dữ liệu tài khoản hoặc trạng thái không hợp lệ.');
            $this->redirect('admin/users');
        }

        $currentAdminId = (int) $_SESSION['user']['id'];
        if ($targetId === $currentAdminId && $newStatus === 'locked') {
            $this->flashError('Bạn không thể tự khóa tài khoản Admin của mình.');
            $this->redirect('admin/user', ['id' => $targetId]);
        }

        if ($target['role'] === 'admin'
            && $target['status'] === 'active'
            && $newStatus === 'locked'
            && $this->userModel->countActiveAdmins() <= 1) {
            $this->flashError('Không thể khóa Admin hoạt động cuối cùng.');
            $this->redirect('admin/user', ['id' => $targetId]);
        }

        if ($target['status'] === $newStatus) {
            $this->flashError('Tài khoản đã ở trạng thái được chọn.');
            $this->redirect('admin/user', ['id' => $targetId]);
        }

        $this->mutateAndLog(
            fn () => $this->userModel->updateStatusByAdmin($targetId, $newStatus),
            $newStatus === 'locked' ? 'admin.user.lock' : 'admin.user.unlock',
            'user',
            $targetId,
            [
                'old_status' => $target['status'],
                'new_status' => $newStatus
            ],
            true
        );

        $this->flashSuccess('Đã cập nhật trạng thái tài khoản.');
        $this->redirect('admin/user', ['id' => $targetId]);
    }

    public function updateRole(): void
    {
        $this->requirePost();
        $this->validateCsrf();

        $targetId = (int) ($_POST['user_id'] ?? 0);
        $newRole = trim($_POST['role'] ?? '');
        $target = $this->userModel->findForAdmin($targetId);

        if (!$target || !in_array($newRole, ['customer', 'owner'], true)) {
            $this->flashError('Dữ liệu tài khoản hoặc vai trò không hợp lệ.');
            $this->redirect('admin/users');
        }

        if ($target['role'] === 'admin') {
            $this->flashError('Không đổi vai trò Admin bằng chức năng này.');
            $this->redirect('admin/user', ['id' => $targetId]);
        }

        if (!in_array($target['role'], ['customer', 'owner'], true)
            || $target['role'] === $newRole) {
            $this->flashError('Vai trò được chọn không tạo thay đổi hợp lệ.');
            $this->redirect('admin/user', ['id' => $targetId]);
        }

        $this->mutateAndLog(
            fn () => $this->userModel->updateRoleByAdmin($targetId, $newRole),
            'admin.user.role_change',
            'user',
            $targetId,
            [
                'old_role' => $target['role'],
                'new_role' => $newRole
            ],
            true
        );

        $this->flashSuccess('Đã cập nhật vai trò tài khoản.');
        $this->redirect('admin/user', ['id' => $targetId]);
    }
}
