<?php

function garantir_estrutura_modelos_classificacao_leads(mysqli $conn): void
{
    $conn->query("CREATE TABLE IF NOT EXISTS classificacao_leads_modelos (
        id_modelo INT AUTO_INCREMENT PRIMARY KEY,
        nome_modelo VARCHAR(120) NOT NULL UNIQUE,
        ativo CHAR(1) DEFAULT 'S',
        data_criacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        data_atualizacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");

    $conn->query("CREATE TABLE IF NOT EXISTS classificacao_leads_modelos_itens (
        id_item INT AUTO_INCREMENT PRIMARY KEY,
        id_modelo_fk INT NOT NULL,
        faixa_minima DECIMAL(10,2) NOT NULL,
        faixa_maxima DECIMAL(10,2) NOT NULL,
        classificacao VARCHAR(50) NOT NULL,
        cor VARCHAR(20) DEFAULT '#cccccc',
        ordem INT NOT NULL DEFAULT 0,
        ativo CHAR(1) DEFAULT 'S',
        data_criacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        data_atualizacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        UNIQUE KEY uk_modelo_classificacao_nome (id_modelo_fk, classificacao),
        CONSTRAINT fk_classificacao_modelos_itens FOREIGN KEY (id_modelo_fk)
            REFERENCES classificacao_leads_modelos(id_modelo) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");

    $checkCol = $conn->query("SELECT COUNT(*) AS total
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_SCHEMA = DATABASE()
          AND TABLE_NAME = 'pesquisas'
          AND COLUMN_NAME = 'id_modelo_classificacao_lead_fk'");

    $hasColumn = 0;
    if ($checkCol) {
        $row = $checkCol->fetch_assoc();
        $hasColumn = (int)($row['total'] ?? 0);
    }

    if ($hasColumn === 0) {
        $conn->query("ALTER TABLE pesquisas ADD COLUMN id_modelo_classificacao_lead_fk INT NULL AFTER id_modelo_faixa_funcionario_fk");
    }

    $checkFk = $conn->query("SELECT COUNT(*) AS total
        FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
        WHERE TABLE_SCHEMA = DATABASE()
          AND TABLE_NAME = 'pesquisas'
          AND COLUMN_NAME = 'id_modelo_classificacao_lead_fk'
          AND REFERENCED_TABLE_NAME = 'classificacao_leads_modelos'");

    $hasFk = 0;
    if ($checkFk) {
        $row = $checkFk->fetch_assoc();
        $hasFk = (int)($row['total'] ?? 0);
    }

    if ($hasFk === 0) {
        @ $conn->query("ALTER TABLE pesquisas
            ADD CONSTRAINT fk_pesquisas_modelo_classificacao_lead
            FOREIGN KEY (id_modelo_classificacao_lead_fk)
            REFERENCES classificacao_leads_modelos(id_modelo)
            ON DELETE SET NULL");
    }
}

function garantir_modelo_classificacao_lead_padrao(mysqli $conn): int
{
    garantir_estrutura_modelos_classificacao_leads($conn);

    $idModeloPadrao = 0;
    $stmt = $conn->prepare("SELECT id_modelo FROM classificacao_leads_modelos WHERE nome_modelo = 'Padrão' LIMIT 1");
    if ($stmt) {
        $stmt->execute();
        $res = $stmt->get_result()->fetch_assoc();
        $idModeloPadrao = (int)($res['id_modelo'] ?? 0);
        $stmt->close();
    }

    if ($idModeloPadrao <= 0) {
        $stmtIns = $conn->prepare("INSERT INTO classificacao_leads_modelos (nome_modelo, ativo) VALUES ('Padrão', 'S')");
        if ($stmtIns) {
            $stmtIns->execute();
            $idModeloPadrao = (int)$conn->insert_id;
            $stmtIns->close();
        }
    }

    if ($idModeloPadrao <= 0) {
        return 0;
    }

    $countItens = 0;
    $stmtCount = $conn->prepare("SELECT COUNT(*) AS total FROM classificacao_leads_modelos_itens WHERE id_modelo_fk = ?");
    if ($stmtCount) {
        $stmtCount->bind_param('i', $idModeloPadrao);
        $stmtCount->execute();
        $rowCount = $stmtCount->get_result()->fetch_assoc();
        $countItens = (int)($rowCount['total'] ?? 0);
        $stmtCount->close();
    }

    if ($countItens === 0) {
        $itens = [];

        $resOld = $conn->query("SELECT faixa_minima, faixa_maxima, classificacao, cor, ordem FROM classificacao_leads ORDER BY ordem ASC, faixa_minima ASC");
        if ($resOld) {
            while ($r = $resOld->fetch_assoc()) {
                $itens[] = [
                    'min' => (float)($r['faixa_minima'] ?? 0),
                    'max' => (float)($r['faixa_maxima'] ?? 0),
                    'classificacao' => trim((string)($r['classificacao'] ?? '')),
                    'cor' => trim((string)($r['cor'] ?? '#cccccc')),
                    'ordem' => (int)($r['ordem'] ?? 0)
                ];
            }
        }

        if (empty($itens)) {
            $itens = [
                ['min' => 0, 'max' => 5, 'classificacao' => 'Frio', 'cor' => '#2196F3', 'ordem' => 1],
                ['min' => 6, 'max' => 10, 'classificacao' => 'Médio', 'cor' => '#FF9800', 'ordem' => 2],
                ['min' => 11, 'max' => 999, 'classificacao' => 'Quente', 'cor' => '#F44336', 'ordem' => 3]
            ];
        }

        $stmtItem = $conn->prepare("INSERT IGNORE INTO classificacao_leads_modelos_itens
            (id_modelo_fk, faixa_minima, faixa_maxima, classificacao, cor, ordem, ativo)
            VALUES (?, ?, ?, ?, ?, ?, 'S')");

        if ($stmtItem) {
            $ordemFallback = 1;
            foreach ($itens as $item) {
                $min = (float)$item['min'];
                $max = (float)$item['max'];
                $classificacao = (string)$item['classificacao'];
                $cor = (string)$item['cor'];
                $ordem = (int)$item['ordem'];
                if ($ordem <= 0) {
                    $ordem = $ordemFallback;
                }
                if ($max < $min) {
                    $max = $min;
                }
                if ($classificacao === '') {
                    continue;
                }

                $stmtItem->bind_param('iddssi', $idModeloPadrao, $min, $max, $classificacao, $cor, $ordem);
                $stmtItem->execute();
                $ordemFallback++;
            }
            $stmtItem->close();
        }
    }

    return $idModeloPadrao;
}

function listar_modelos_classificacao_leads(mysqli $conn, bool $somenteAtivos = true): array
{
    garantir_modelo_classificacao_lead_padrao($conn);

    $sql = "SELECT id_modelo, nome_modelo, ativo FROM classificacao_leads_modelos";
    if ($somenteAtivos) {
        $sql .= " WHERE ativo = 'S'";
    }
    $sql .= " ORDER BY nome_modelo";

    $dados = [];
    $res = $conn->query($sql);
    if ($res) {
        while ($row = $res->fetch_assoc()) {
            $dados[] = $row;
        }
    }

    return $dados;
}

function listar_classificacoes_por_modelo(mysqli $conn, int $idModelo, bool $somenteAtivos = true): array
{
    if ($idModelo <= 0) {
        return [];
    }

    $sql = "SELECT id_item, id_modelo_fk, faixa_minima, faixa_maxima, classificacao, cor, ordem, ativo
            FROM classificacao_leads_modelos_itens
            WHERE id_modelo_fk = ?";
    if ($somenteAtivos) {
        $sql .= " AND ativo = 'S'";
    }
    $sql .= " ORDER BY ordem ASC, faixa_minima ASC";

    $stmt = $conn->prepare($sql);
    if (!$stmt) {
        return [];
    }

    $stmt->bind_param('i', $idModelo);
    $stmt->execute();
    $res = $stmt->get_result();

    $dados = [];
    while ($row = $res->fetch_assoc()) {
        $dados[] = $row;
    }

    $stmt->close();
    return $dados;
}

function obter_classificacao_por_nota_modelo(mysqli $conn, int $idModelo, float $nota): array
{
    if ($idModelo <= 0) {
        return [
            'classificacao' => '-',
            'cor' => '#cccccc'
        ];
    }

    $stmt = $conn->prepare("SELECT classificacao, cor
        FROM classificacao_leads_modelos_itens
        WHERE id_modelo_fk = ?
          AND ativo = 'S'
          AND ? >= faixa_minima
          AND ? <= faixa_maxima
        ORDER BY ordem ASC
        LIMIT 1");

    if (!$stmt) {
        return [
            'classificacao' => '-',
            'cor' => '#cccccc'
        ];
    }

    $stmt->bind_param('idd', $idModelo, $nota, $nota);
    $stmt->execute();
    $row = $stmt->get_result()->fetch_assoc();
    $stmt->close();

    if ($row) {
        return [
            'classificacao' => (string)($row['classificacao'] ?? '-'),
            'cor' => (string)($row['cor'] ?? '#cccccc')
        ];
    }

    return [
        'classificacao' => '-',
        'cor' => '#cccccc'
    ];
}
