<?php
class BeginnerInstructor
{
    public static function register(array $data): array
    {
        Database::migrate();
        $name = trim((string)($data['name'] ?? ''));
        $cpf = only_digits((string)($data['cpf'] ?? ''));
        $email = strtolower(trim((string)($data['email'] ?? '')));
        $whatsapp = normalize_whatsapp_br((string)($data['whatsapp'] ?? ''));
        $password = (string)($data['password'] ?? '');

        if ($name === '' || $email === '' || $cpf === '' || $whatsapp === '' || $password === '') {
            return ['ok' => false, 'message' => 'Preencha todos os campos do cadastro.'];
        }
        if (!is_valid_cpf_strict($cpf)) {
            return ['ok' => false, 'message' => 'CPF inválido. Informe um CPF verdadeiro, sem números repetidos ou sequenciais.'];
        }
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            return ['ok' => false, 'message' => 'Informe um e-mail válido.'];
        }
        if (!is_valid_whatsapp_br_strict($whatsapp)) {
            return ['ok' => false, 'message' => 'WhatsApp inválido. Informe DDD e celular com 11 dígitos, sem números repetidos ou sequenciais.'];
        }
        if (strlen($password) < 6) {
            return ['ok' => false, 'message' => 'A senha precisa ter no mínimo 6 caracteres.'];
        }
        try {
            $stmt = Database::pdo()->prepare("INSERT INTO beginner_instructors (name, cpf, email, whatsapp, password_hash, status, created_at) VALUES (?, ?, ?, ?, ?, 'active', ?)");
            $stmt->execute([$name, $cpf, $email, $whatsapp, password_hash($password, PASSWORD_DEFAULT), date('Y-m-d H:i:s')]);
            return ['ok' => true, 'message' => 'Cadastro criado. Agora entre na área de estudos.'];
        } catch (PDOException $e) {
            if ($e->getCode() === '23000' || str_contains(strtolower($e->getMessage()), 'unique')) {
                return ['ok' => false, 'message' => 'CPF ou e-mail já cadastrado.'];
            }
            return ['ok' => false, 'message' => 'Não foi possível concluir o cadastro.'];
        }
    }

    public static function login(string $email, string $password): bool
    {
        Database::migrate();
        $stmt = Database::pdo()->prepare("SELECT * FROM beginner_instructors WHERE email = ? AND status = 'active' LIMIT 1");
        $stmt->execute([strtolower(trim($email))]);
        $instructor = $stmt->fetch();
        if (!$instructor || !password_verify($password, $instructor['password_hash'])) {
            return false;
        }
        session_regenerate_id(true);
        $_SESSION['beginner_instructor_id'] = (int)$instructor['id'];
        unset($_SESSION['user_id'], $_SESSION['role'], $_SESSION['professional_id'], $_SESSION['professional_name']);
        return true;
    }

    public static function current(): ?array
    {
        if (empty($_SESSION['beginner_instructor_id'])) {
            return null;
        }
        return self::find((int)$_SESSION['beginner_instructor_id']);
    }

    public static function requireLogin(): array
    {
        $current = self::current();
        if (!$current || ($current['status'] ?? '') !== 'active') {
            unset($_SESSION['beginner_instructor_id']);
            redirect('beginner/login');
        }
        return $current;
    }

    public static function logout(): void
    {
        unset($_SESSION['beginner_instructor_id']);
    }

    public static function find(int $id): ?array
    {
        Database::migrate();
        $stmt = Database::pdo()->prepare('SELECT * FROM beginner_instructors WHERE id = ? LIMIT 1');
        $stmt->execute([$id]);
        $row = $stmt->fetch();
        return $row ?: null;
    }

    public static function all(): array
    {
        Database::migrate();
        return Database::pdo()->query('SELECT * FROM beginner_instructors ORDER BY created_at DESC')->fetchAll();
    }

    public static function delete(int $id): array
    {
        Database::migrate();
        if ($id <= 0 || !self::find($id)) {
            return ['ok' => false, 'message' => 'Instrutor em formação não encontrado.'];
        }
        $pdo = Database::pdo();
        try {
            $pdo->beginTransaction();
            $stmt = $pdo->prepare('DELETE FROM beginner_instructors WHERE id = ?');
            $stmt->execute([$id]);
            if ($stmt->rowCount() <= 0) {
                $pdo->rollBack();
                return ['ok' => false, 'message' => 'Instrutor em formação não encontrado.'];
            }
            $pdo->commit();
            return ['ok' => true, 'message' => 'Conta do instrutor em formação apagada com sucesso.'];
        } catch (Throwable $e) {
            if ($pdo->inTransaction()) $pdo->rollBack();
            return ['ok' => false, 'message' => 'Não foi possível apagar a conta. Verifique se há registros vinculados que precisam ser preservados.'];
        }
    }

    public static function updateStatus(int $id, string $status, string $notes = ''): array
    {
        Database::migrate();
        if (!in_array($status, ['active', 'blocked'], true)) {
            return ['ok' => false, 'message' => 'Status inválido.'];
        }
        if (!self::find($id)) {
            return ['ok' => false, 'message' => 'Instrutor em aprendizado não encontrado.'];
        }
        $stmt = Database::pdo()->prepare('UPDATE beginner_instructors SET status = ?, admin_notes = ? WHERE id = ?');
        $stmt->execute([$status, trim($notes), $id]);
        return ['ok' => true, 'message' => 'Cadastro atualizado.'];
    }
}
