<?php

function garantir_estrutura_modelos_departamentos(mysqli $conn): void
{
    $conn->query("CREATE TABLE IF NOT EXISTS departamentos_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 departamentos_modelos_itens (
        id_item INT AUTO_INCREMENT PRIMARY KEY,
        id_modelo_fk INT NOT NULL,
        nome_departamento 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_departamento (id_modelo_fk, nome_departamento),
        CONSTRAINT fk_modelo_departamentos_itens FOREIGN KEY (id_modelo_fk)
            REFERENCES departamentos_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_departamento_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_departamento_fk INT NULL AFTER idbase_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_departamento_fk'
          AND REFERENCED_TABLE_NAME = 'departamentos_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_departamento
            FOREIGN KEY (id_modelo_departamento_fk)
            REFERENCES departamentos_modelos(id_modelo)
            ON DELETE SET NULL");
    }
}

function garantir_modelo_departamento_padrao(mysqli $conn): int
{
    garantir_estrutura_modelos_departamentos($conn);

    $idModeloPadrao = 0;
    $stmt = $conn->prepare("SELECT id_modelo FROM departamentos_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 departamentos_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 departamentos_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) {
        $departamentos = [];
        $resOld = $conn->query("SELECT nome_departamento FROM departamentos WHERE ativo = 'S' ORDER BY nome_departamento");
        if ($resOld) {
            while ($r = $resOld->fetch_assoc()) {
                $nome = trim((string)($r['nome_departamento'] ?? ''));
                if ($nome !== '') {
                    $departamentos[] = $nome;
                }
            }
        }

        if (empty($departamentos)) {
            $departamentos = ['Principal', 'Comercial', 'Financeiro', 'Compras', 'TI', 'Marketing', 'RH', 'Operações'];
        }

        $ordem = 1;
        $stmtItem = $conn->prepare("INSERT IGNORE INTO departamentos_modelos_itens (id_modelo_fk, nome_departamento, ativo, ordem) VALUES (?, ?, 'S', ?)");
        if ($stmtItem) {
            foreach ($departamentos as $dep) {
                $stmtItem->bind_param('isi', $idModeloPadrao, $dep, $ordem);
                $stmtItem->execute();
                $ordem++;
            }
            $stmtItem->close();
        }
    }

    return $idModeloPadrao;
}

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

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

    $stmt = $conn->prepare("SELECT nome_departamento
        FROM departamentos_modelos_itens
        WHERE id_modelo_fk = ? AND ativo = 'S'
        ORDER BY ordem ASC, nome_departamento ASC
        LIMIT 1");

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

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

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

function area_pertence_modelo(mysqli $conn, int $idModelo, string $area): bool
{
    $area = trim($area);
    if ($idModelo <= 0 || $area === '') {
        return false;
    }

    $stmt = $conn->prepare("SELECT 1
        FROM departamentos_modelos_itens
        WHERE id_modelo_fk = ?
          AND ativo = 'S'
          AND LOWER(TRIM(nome_departamento)) = LOWER(TRIM(?))
        LIMIT 1");
    if (!$stmt) {
        return false;
    }

    $stmt->bind_param('is', $idModelo, $area);
    $stmt->execute();
    $ok = $stmt->get_result()->num_rows > 0;
    $stmt->close();

    return $ok;
}

function normalizar_area_por_modelo(mysqli $conn, int $idModelo, string $area): string
{
    $area = trim($area);
    if ($idModelo <= 0) {
        return $area;
    }

    if ($area !== '' && area_pertence_modelo($conn, $idModelo, $area)) {
        return $area;
    }

    return primeira_area_modelo($conn, $idModelo);
}
