<?php
declare(strict_types=1);

function connectDB(): mysqli
{
    static $conn = null;

    if ($conn instanceof mysqli) {
        return $conn;
    }

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    $conn = new mysqli(
        'localhost',
        'professoremerson_climatiza',
        'Climatiza00*',
        'professoremerson_orcamento_climatiza'
    );

    $conn->set_charset('utf8mb4');

    return $conn;
}

function createUsersTableIfNeeded(): void
{
    try {
        $db = connectDB();
        $sql = <<<SQL
        CREATE TABLE IF NOT EXISTS usuarios (
            id INT AUTO_INCREMENT PRIMARY KEY,
            nome_profissional VARCHAR(150) NOT NULL,
            telefone_profissional VARCHAR(20) NOT NULL,
            quantidade_orcamentos INT NOT NULL DEFAULT 0,
            primeiro_orcamento DATETIME NULL,
            ultimo_orcamento DATETIME NULL,
            created_at DATETIME NOT NULL,
            updated_at DATETIME NOT NULL,
            UNIQUE KEY uniq_profissional_telefone (nome_profissional, telefone_profissional)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
        SQL;
        $db->query($sql);
    } catch (Throwable $e) {
        // Mantém o sistema operacional mesmo se a tabela ainda não existir no primeiro acesso.
    }
}

function upsertProfessional(string $nome, string $telefone): void
{
    $nome = trim($nome);
    $telefone = trim($telefone);

    if ($nome === '' || $telefone === '') {
        return;
    }

    createUsersTableIfNeeded();
    $db = connectDB();

    $select = $db->prepare('SELECT id FROM usuarios WHERE nome_profissional = ? AND telefone_profissional = ? LIMIT 1');
    $select->bind_param('ss', $nome, $telefone);
    $select->execute();
    $result = $select->get_result();
    $row = $result ? $result->fetch_assoc() : null;
    $select->close();

    $now = date('Y-m-d H:i:s');

    if ($row && isset($row['id'])) {
        $id = (int) $row['id'];
        $update = $db->prepare('UPDATE usuarios SET updated_at = ? WHERE id = ?');
        $update->bind_param('si', $now, $id);
        $update->execute();
        $update->close();
        return;
    }

    $insert = $db->prepare('
        INSERT INTO usuarios (
            nome_profissional,
            telefone_profissional,
            quantidade_orcamentos,
            primeiro_orcamento,
            ultimo_orcamento,
            created_at,
            updated_at
        ) VALUES (?, ?, 0, NULL, NULL, ?, ?)
    ');
    $insert->bind_param('ssss', $nome, $telefone, $now, $now);
    $insert->execute();
    $insert->close();
}

function incrementBudgetMetrics(string $nome, string $telefone): void
{
    $nome = trim($nome);
    $telefone = trim($telefone);

    if ($nome === '' || $telefone === '') {
        return;
    }

    createUsersTableIfNeeded();
    $db = connectDB();
    $now = date('Y-m-d H:i:s');

    upsertProfessional($nome, $telefone);

    $select = $db->prepare('SELECT id, quantidade_orcamentos, primeiro_orcamento FROM usuarios WHERE nome_profissional = ? AND telefone_profissional = ? LIMIT 1');
    $select->bind_param('ss', $nome, $telefone);
    $select->execute();
    $result = $select->get_result();
    $row = $result ? $result->fetch_assoc() : null;
    $select->close();

    if (!$row) {
        return;
    }

    $id = (int) $row['id'];
    $quantidade = ((int) ($row['quantidade_orcamentos'] ?? 0)) + 1;
    $primeiro = $row['primeiro_orcamento'] ?: $now;

    $update = $db->prepare('
        UPDATE usuarios
        SET quantidade_orcamentos = ?, primeiro_orcamento = ?, ultimo_orcamento = ?, updated_at = ?
        WHERE id = ?
    ');
    $update->bind_param('isssi', $quantidade, $primeiro, $now, $now, $id);
    $update->execute();
    $update->close();
}
