<?php

function garantir_estrutura_modelos_faixa_funcionarios(mysqli $conn): void
{
    $conn->query("CREATE TABLE IF NOT EXISTS faixa_funcionarios_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 faixa_funcionarios_modelos_itens (
        id_item INT AUTO_INCREMENT PRIMARY KEY,
        id_modelo_fk INT NOT NULL,
        nome_faixa VARCHAR(120) NOT NULL,
        quantidade_minima INT NOT NULL,
        quantidade_maxima INT 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_faixa_nome (id_modelo_fk, nome_faixa),
        CONSTRAINT fk_faixa_modelos_itens FOREIGN KEY (id_modelo_fk)
            REFERENCES faixa_funcionarios_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_faixa_funcionario_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_faixa_funcionario_fk INT NULL AFTER id_modelo_departamento_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_faixa_funcionario_fk'
          AND REFERENCED_TABLE_NAME = 'faixa_funcionarios_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_faixa_funcionario
            FOREIGN KEY (id_modelo_faixa_funcionario_fk)
            REFERENCES faixa_funcionarios_modelos(id_modelo)
            ON DELETE SET NULL");
    }
}

function garantir_modelo_faixa_funcionario_padrao(mysqli $conn): int
{
    garantir_estrutura_modelos_faixa_funcionarios($conn);

    $idModeloPadrao = 0;
    $stmt = $conn->prepare("SELECT id_modelo FROM faixa_funcionarios_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 faixa_funcionarios_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 faixa_funcionarios_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) {
        $faixas = [];

        $resOld = $conn->query("SELECT nome_faixa, quantidade_minima, quantidade_maxima, ordem FROM faixa_funcionarios ORDER BY ordem, quantidade_minima");
        if ($resOld) {
            while ($r = $resOld->fetch_assoc()) {
                $nome = trim((string)($r['nome_faixa'] ?? ''));
                $min = (int)($r['quantidade_minima'] ?? 0);
                $max = (int)($r['quantidade_maxima'] ?? 0);
                $ord = (int)($r['ordem'] ?? 0);

                if ($nome !== '') {
                    $faixas[] = [
                        'nome' => $nome,
                        'min' => $min,
                        'max' => $max,
                        'ordem' => $ord
                    ];
                }
            }
        }

        if (empty($faixas)) {
            $faixas = [
                ['nome' => '1 a 10 funcionários', 'min' => 1, 'max' => 10, 'ordem' => 1],
                ['nome' => '11 a 50 funcionários', 'min' => 11, 'max' => 50, 'ordem' => 2],
                ['nome' => '51 a 100 funcionários', 'min' => 51, 'max' => 100, 'ordem' => 3],
                ['nome' => '101 a 500 funcionários', 'min' => 101, 'max' => 500, 'ordem' => 4],
                ['nome' => '501+ funcionários', 'min' => 501, 'max' => 9999999, 'ordem' => 5]
            ];
        }

        $stmtItem = $conn->prepare("INSERT IGNORE INTO faixa_funcionarios_modelos_itens (id_modelo_fk, nome_faixa, quantidade_minima, quantidade_maxima, ativo, ordem) VALUES (?, ?, ?, ?, 'S', ?)");
        if ($stmtItem) {
            $ordemFallback = 1;
            foreach ($faixas as $faixa) {
                $nome = (string)$faixa['nome'];
                $min = (int)$faixa['min'];
                $max = (int)$faixa['max'];
                $ordem = (int)$faixa['ordem'];
                if ($ordem <= 0) {
                    $ordem = $ordemFallback;
                }

                if ($max < $min) {
                    $max = $min;
                }

                $stmtItem->bind_param('isiii', $idModeloPadrao, $nome, $min, $max, $ordem);
                $stmtItem->execute();
                $ordemFallback++;
            }
            $stmtItem->close();
        }
    }

    return $idModeloPadrao;
}

function listar_modelos_faixa_funcionarios(mysqli $conn, bool $somenteAtivos = true): array
{
    garantir_modelo_faixa_funcionario_padrao($conn);

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

    $sql = "SELECT id_item, id_modelo_fk, nome_faixa, quantidade_minima, quantidade_maxima, ativo, ordem
            FROM faixa_funcionarios_modelos_itens
            WHERE id_modelo_fk = ?";
    if ($somenteAtivos) {
        $sql .= " AND ativo = 'S'";
    }
    $sql .= " ORDER BY ordem ASC, quantidade_minima ASC, nome_faixa 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;
}
