<?php

function garantir_estrutura_modelos_contato_status(mysqli $conn): void
{
    $conn->query("CREATE TABLE IF NOT EXISTS contato_status_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 contato_status_modelos_itens (
        id_item INT AUTO_INCREMENT PRIMARY KEY,
        id_modelo_fk INT NOT NULL,
        contato_status VARCHAR(120) NOT NULL,
        ativo CHAR(1) DEFAULT 'S',
        ordem INT DEFAULT 0,
        data_criacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        data_atualizacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        UNIQUE KEY uk_modelo_contato_status (id_modelo_fk, contato_status),
        CONSTRAINT fk_contato_status_modelos_itens FOREIGN KEY (id_modelo_fk)
            REFERENCES contato_status_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_contato_status_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_contato_status_fk INT NULL AFTER id_modelo_classificacao_lead_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_contato_status_fk'
          AND REFERENCED_TABLE_NAME = 'contato_status_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_contato_status
            FOREIGN KEY (id_modelo_contato_status_fk)
            REFERENCES contato_status_modelos(id_modelo)
            ON DELETE SET NULL");
    }
}

function garantir_modelo_contato_status_padrao(mysqli $conn): int
{
    garantir_estrutura_modelos_contato_status($conn);

    $idModeloPadrao = 0;
    $stmt = $conn->prepare("SELECT id_modelo FROM contato_status_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 contato_status_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 contato_status_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 idcontato_status, contato_status FROM contato_status ORDER BY idcontato_status");
        if ($resOld) {
            $ordem = 1;
            while ($r = $resOld->fetch_assoc()) {
                $nome = trim((string)($r['contato_status'] ?? ''));
                if ($nome !== '') {
                    $itens[] = ['nome' => $nome, 'ordem' => $ordem];
                    $ordem++;
                }
            }
        }

        if (empty($itens)) {
            $itens = [
                ['nome' => 'Positiva', 'ordem' => 1],
                ['nome' => 'Neutra', 'ordem' => 2],
                ['nome' => 'Negativa', 'ordem' => 3],
                ['nome' => 'Sem retorno', 'ordem' => 4]
            ];
        }

        $stmtItem = $conn->prepare("INSERT IGNORE INTO contato_status_modelos_itens (id_modelo_fk, contato_status, ativo, ordem) VALUES (?, ?, 'S', ?)");
        if ($stmtItem) {
            foreach ($itens as $item) {
                $nome = (string)$item['nome'];
                $ordem = (int)$item['ordem'];
                $stmtItem->bind_param('isi', $idModeloPadrao, $nome, $ordem);
                $stmtItem->execute();
            }
            $stmtItem->close();
        }
    }

    return $idModeloPadrao;
}

function listar_modelos_contato_status(mysqli $conn, bool $somenteAtivos = true): array
{
    garantir_modelo_contato_status_padrao($conn);

    $sql = "SELECT id_modelo, nome_modelo, ativo FROM contato_status_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_status_contato_por_modelo(mysqli $conn, int $idModelo, bool $somenteAtivos = true): array
{
    if ($idModelo <= 0) {
        return [];
    }

    $sql = "SELECT id_item, id_modelo_fk, contato_status, ativo, ordem
            FROM contato_status_modelos_itens
            WHERE id_modelo_fk = ?";
    if ($somenteAtivos) {
        $sql .= " AND ativo = 'S'";
    }
    $sql .= " ORDER BY ordem ASC, contato_status 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 status_contato_por_modelo(mysqli $conn, int $idModelo, int $idStatus): string
{
    if ($idModelo <= 0 || $idStatus <= 0) {
        return '';
    }

    $stmt = $conn->prepare("SELECT contato_status
        FROM contato_status_modelos_itens
        WHERE id_item = ?
          AND id_modelo_fk = ?
          AND ativo = 'S'
        LIMIT 1");

    if (!$stmt) {
        return '';
    }

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

    return trim((string)($row['contato_status'] ?? ''));
}
