<?php
include 'verifica_login.php';
include 'conexao.php';
include 'config/base_utils.php';
include 'config/cliente_projeto_utils.php';
include 'config/departamento_modelo_utils.php';
include 'config/faixa_funcionario_modelo_utils.php';
include 'config/classificacao_lead_modelo_utils.php';
include 'config/contato_status_modelo_utils.php';
$conn = conectar_banco();
garantir_estrutura_bases($conn);
garantir_estrutura_clientes_projetos($conn);
garantir_modelo_departamento_padrao($conn);
garantir_modelo_faixa_funcionario_padrao($conn);
garantir_modelo_classificacao_lead_padrao($conn);
garantir_modelo_contato_status_padrao($conn);

function json_response($success, $data = []) {
    header('Content-Type: application/json');
    echo json_encode(array_merge(['success' => $success], $data));
    exit;
}

function montar_redirect_montagem_questionario($nome_pesquisa, $total_empresas) {
    $detalhe = 'Pesquisa "' . $nome_pesquisa . '" criada com sucesso para ' . (int)$total_empresas . ' empresa(s).';
    return 'montagem_questionario.php?msg=success&detalhe=' . urlencode($detalhe);
}

$action = $_GET['action'] ?? '';

if ($action === 'list_questionarios') {
    $id_projeto = (int)($_GET['id_projeto'] ?? 0);
    if ($id_projeto <= 0) {
        json_response(false, ['message' => 'Projeto inválido']);
    }

    $stmtQ = $conn->prepare("SELECT id, nome FROM questionario_template WHERE ativo = 'S' AND id_projeto_fk = ? ORDER BY nome");
    if (!$stmtQ) {
        json_response(false, ['message' => 'Erro ao buscar questionários']);
    }
    $stmtQ->bind_param('i', $id_projeto);
    $stmtQ->execute();
    $resQ = $stmtQ->get_result();

    $dados = [];
    while ($r = $resQ->fetch_assoc()) {
        $dados[] = ['id' => (int)$r['id'], 'nome' => $r['nome']];
    }

    json_response(true, ['questionarios' => $dados]);
}

$nome = trim($_POST['nome'] ?? '');
$id_projeto = (int)($_POST['id_projeto'] ?? 0);
$id_questionario_template = (int)($_POST['id_questionario_template'] ?? 0);
$idbase = (int)($_POST['idbase'] ?? 0);
$id_modelo_departamento = (int)($_POST['id_modelo_departamento'] ?? 0);
$id_modelo_faixa_funcionario = (int)($_POST['id_modelo_faixa_funcionario'] ?? 0);
$id_modelo_classificacao = (int)($_POST['id_modelo_classificacao'] ?? 0);
$id_modelo_contato_status = (int)($_POST['id_modelo_contato_status'] ?? 0);
$data_pesquisa = trim($_POST['data_pesquisa'] ?? '');
$status = trim($_POST['status'] ?? 'ativa');
$descricao = trim($_POST['descricao'] ?? '');

// Responsável pela pesquisa (usuário logado)
$responsavel_pesquisa = $_SESSION['usuario_nome'] ?? '';

// Definir status padrão do questionário (ex: "Não trabalhado")
$status_padrao = null;
if ($res = $conn->query("SELECT id_status FROM statusdoquestionario WHERE nome_status LIKE '%não trabalhad%' LIMIT 1")) {
    $row = $res->fetch_assoc();
    if ($row && isset($row['id_status'])) {
        $status_padrao = (int)$row['id_status'];
    }
}

$chunk_size = 200;

// Validações (apenas quando há action 'init' ou no fluxo padrão)
if ($action === 'init' || empty($action)) {
    if (empty($nome)) {
        if ($action) json_response(false, ['message' => 'Nome da pesquisa é obrigatório']);
        header('Location: nova_pesquisa.php?msg=error&detalhe=' . urlencode('Nome da pesquisa é obrigatório'));
        exit;
    }

    if ($id_questionario_template <= 0) {
        if ($action) json_response(false, ['message' => 'Selecione um questionário']);
        header('Location: nova_pesquisa.php?msg=error&detalhe=' . urlencode('Selecione um questionário'));
        exit;
    }

    if ($id_projeto <= 0) {
        if ($action) json_response(false, ['message' => 'Selecione um projeto']);
        header('Location: nova_pesquisa.php?msg=error&detalhe=' . urlencode('Selecione um projeto'));
        exit;
    }

    if ($idbase <= 0) {
        if ($action) json_response(false, ['message' => 'Selecione uma base']);
        header('Location: nova_pesquisa.php?msg=error&detalhe=' . urlencode('Selecione uma base'));
        exit;
    }

    if ($id_modelo_departamento <= 0) {
        if ($action) json_response(false, ['message' => 'Selecione um modelo de departamentos']);
        header('Location: nova_pesquisa.php?msg=error&detalhe=' . urlencode('Selecione um modelo de departamentos'));
        exit;
    }

    if ($id_modelo_classificacao <= 0) {
        if ($action) json_response(false, ['message' => 'Selecione um modelo de classificação de leads']);
        header('Location: nova_pesquisa.php?msg=error&detalhe=' . urlencode('Selecione um modelo de classificação de leads'));
        exit;
    }

    if ($id_modelo_faixa_funcionario <= 0) {
        if ($action) json_response(false, ['message' => 'Selecione um modelo de faixas de funcionários']);
        header('Location: nova_pesquisa.php?msg=error&detalhe=' . urlencode('Selecione um modelo de faixas de funcionários'));
        exit;
    }

    if ($id_modelo_contato_status <= 0) {
        if ($action) json_response(false, ['message' => 'Selecione um modelo de status do contato']);
        header('Location: nova_pesquisa.php?msg=error&detalhe=' . urlencode('Selecione um modelo de status do contato'));
        exit;
    }

    if (empty($data_pesquisa)) {
        if ($action) json_response(false, ['message' => 'Data da pesquisa é obrigatória']);
        header('Location: nova_pesquisa.php?msg=error&detalhe=' . urlencode('Data da pesquisa é obrigatória'));
        exit;
    }

    // Verificar se o template existe e está ativo
    $stmt = $conn->prepare("SELECT id FROM questionario_template WHERE id = ? AND id_projeto_fk = ? AND ativo = 'S'");
    $stmt->bind_param('ii', $id_questionario_template, $id_projeto);
    $stmt->execute();
    if ($stmt->get_result()->num_rows === 0) {
        if ($action) json_response(false, ['message' => 'Questionário inválido para o projeto selecionado']);
        header('Location: nova_pesquisa.php?msg=error&detalhe=' . urlencode('Questionário inválido para o projeto selecionado'));
        exit;
    }

    $stmtModelo = $conn->prepare("SELECT id_modelo FROM departamentos_modelos WHERE id_modelo = ? AND ativo = 'S'");
    $stmtModelo->bind_param('i', $id_modelo_departamento);
    $stmtModelo->execute();
    if ($stmtModelo->get_result()->num_rows === 0) {
        if ($action) json_response(false, ['message' => 'Modelo de departamentos inválido']);
        header('Location: nova_pesquisa.php?msg=error&detalhe=' . urlencode('Modelo de departamentos inválido'));
        exit;
    }

    $stmtModeloClassificacao = $conn->prepare("SELECT id_modelo FROM classificacao_leads_modelos WHERE id_modelo = ? AND ativo = 'S'");
    $stmtModeloClassificacao->bind_param('i', $id_modelo_classificacao);
    $stmtModeloClassificacao->execute();
    if ($stmtModeloClassificacao->get_result()->num_rows === 0) {
        if ($action) json_response(false, ['message' => 'Modelo de classificação de leads inválido']);
        header('Location: nova_pesquisa.php?msg=error&detalhe=' . urlencode('Modelo de classificação de leads inválido'));
        exit;
    }

    $stmtModeloFaixa = $conn->prepare("SELECT id_modelo FROM faixa_funcionarios_modelos WHERE id_modelo = ? AND ativo = 'S'");
    $stmtModeloFaixa->bind_param('i', $id_modelo_faixa_funcionario);
    $stmtModeloFaixa->execute();
    if ($stmtModeloFaixa->get_result()->num_rows === 0) {
        if ($action) json_response(false, ['message' => 'Modelo de faixas de funcionários inválido']);
        header('Location: nova_pesquisa.php?msg=error&detalhe=' . urlencode('Modelo de faixas de funcionários inválido'));
        exit;
    }

    $stmtModeloContatoStatus = $conn->prepare("SELECT id_modelo FROM contato_status_modelos WHERE id_modelo = ? AND ativo = 'S'");
    $stmtModeloContatoStatus->bind_param('i', $id_modelo_contato_status);
    $stmtModeloContatoStatus->execute();
    if ($stmtModeloContatoStatus->get_result()->num_rows === 0) {
        if ($action) json_response(false, ['message' => 'Modelo de status do contato inválido']);
        header('Location: nova_pesquisa.php?msg=error&detalhe=' . urlencode('Modelo de status do contato inválido'));
        exit;
    }

    // Criar nova pesquisa
    $stmt = $conn->prepare("INSERT INTO pesquisas (nome, id_questionario_template_fk, id_projeto_fk, idbase_fk, id_modelo_departamento_fk, id_modelo_faixa_funcionario_fk, id_modelo_classificacao_lead_fk, id_modelo_contato_status_fk, data_pesquisa, status, descricao) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
    $stmt->bind_param('siiiiiiisss', $nome, $id_questionario_template, $id_projeto, $idbase, $id_modelo_departamento, $id_modelo_faixa_funcionario, $id_modelo_classificacao, $id_modelo_contato_status, $data_pesquisa, $status, $descricao);

    if (!$stmt->execute()) {
        if ($action) json_response(false, ['message' => 'Erro ao criar pesquisa: ' . $conn->error]);
        header('Location: nova_pesquisa.php?msg=error&detalhe=' . urlencode('Erro ao criar pesquisa: ' . $conn->error));
        exit;
    }

    $id_pesquisa = $conn->insert_id;

    // Obter todas as empresas ativas
    $stmt = $conn->prepare("SELECT ID_EMPRESA FROM empresas WHERE ATIVA = 'S' AND idbase = ? ORDER BY NOME_FANTASIA");
    $stmt->bind_param('i', $idbase);
    $stmt->execute();
    $empresas = $stmt->get_result();

    $empresa_ids = [];
    while ($empresa = $empresas->fetch_assoc()) {
        $empresa_ids[] = (int)$empresa['ID_EMPRESA'];
    }

    if ($action === 'init') {
        if (count($empresa_ids) === 0) {
            $stmt = $conn->prepare("DELETE FROM pesquisas WHERE id = ?");
            $stmt->bind_param('i', $id_pesquisa);
            $stmt->execute();
            json_response(false, ['message' => 'Nenhuma empresa ativa encontrada']);
        }

        $_SESSION['pesquisa_progress'] = [
            'id_pesquisa' => $id_pesquisa,
            'empresa_ids' => $empresa_ids,
            'total' => count($empresa_ids),
            'index' => 0,
            'responsavel' => $responsavel_pesquisa,
            'status_padrao' => $status_padrao,
            'idbase' => $idbase,
            'id_modelo_departamento' => $id_modelo_departamento,
            'nome_pesquisa' => $nome
        ];

        json_response(true, [
            'total' => count($empresa_ids),
            'processed' => 0,
            'id_pesquisa' => $id_pesquisa
        ]);
    }

    // Fluxo padrão (sem barra de progresso) - inserção em lote
    $stmt_insert = $conn->prepare("INSERT INTO pesquisa_empresa (id_pesquisa_fk, id_empresa_fk, status, responsavel_pesquisa, id_status_questionario_fk)
        SELECT ?, e.ID_EMPRESA, 'pendente', ?, ?
        FROM empresas e
        WHERE e.ATIVA = 'S' AND e.idbase = ?");
    $stmt_insert->bind_param('isii', $id_pesquisa, $responsavel_pesquisa, $status_padrao, $idbase);
    $stmt_insert->execute();
    $total_empresas = $stmt_insert->affected_rows;

    if ($total_empresas > 0) {
        $stmt_contatos_insert = $conn->prepare("INSERT INTO pesquisa_contatos (id_pesquisa_empresa_fk, id_contato_empresa_fk, nome, email, telefone, area)
            SELECT pe.id, c.idcontatos_empresa, c.nome, c.email, c.tel AS telefone,
                COALESCE(md_ok.nome_departamento, md_default.nome_departamento, '') AS area
            FROM pesquisa_empresa pe
            INNER JOIN contatos_empresa c ON c.id_empresa = pe.id_empresa_fk
            LEFT JOIN departamentos_modelos_itens md_ok
                ON md_ok.id_modelo_fk = ?
               AND md_ok.ativo = 'S'
               AND LOWER(TRIM(md_ok.nome_departamento)) = LOWER(TRIM(c.depto))
            LEFT JOIN departamentos_modelos_itens md_default
                ON md_default.id_item = (
                    SELECT mdi2.id_item
                    FROM departamentos_modelos_itens mdi2
                    WHERE mdi2.id_modelo_fk = ? AND mdi2.ativo = 'S'
                    ORDER BY mdi2.ordem ASC, mdi2.nome_departamento ASC
                    LIMIT 1
                )
            WHERE pe.id_pesquisa_fk = ?");
        $stmt_contatos_insert->bind_param('iii', $id_modelo_departamento, $id_modelo_departamento, $id_pesquisa);
        $stmt_contatos_insert->execute();
    }

    if ($total_empresas > 0) {
        header('Location: ' . montar_redirect_montagem_questionario($nome, $total_empresas));
    } else {
        $stmt = $conn->prepare("DELETE FROM pesquisas WHERE id = ?");
        $stmt->bind_param('i', $id_pesquisa);
        $stmt->execute();
        
        header('Location: nova_pesquisa.php?msg=error&detalhe=' . urlencode('Nenhuma empresa ativa encontrada'));
    }
    exit;
}

if ($action === 'step') {
    if (empty($_SESSION['pesquisa_progress'])) {
        json_response(false, ['message' => 'Sessão de progresso não encontrada']);
    }

    $progress = $_SESSION['pesquisa_progress'];
    $index = $progress['index'];
    $total = $progress['total'];

    if ($index >= $total) {
        json_response(true, [
            'done' => true,
            'processed' => $total,
            'total' => $total,
            'redirect' => montar_redirect_montagem_questionario($progress['nome_pesquisa'] ?? 'Sem nome', $total)
        ]);
    }

    $batch = array_slice($progress['empresa_ids'], $index, $chunk_size);
    if (empty($batch)) {
        json_response(true, [
            'done' => true,
            'processed' => $total,
            'total' => $total,
            'redirect' => montar_redirect_montagem_questionario($progress['nome_pesquisa'] ?? 'Sem nome', $total)
        ]);
    }

    $placeholders = implode(',', array_fill(0, count($batch), '?'));
    $sql_insert = "INSERT INTO pesquisa_empresa (id_pesquisa_fk, id_empresa_fk, status, responsavel_pesquisa, id_status_questionario_fk)
        SELECT ?, e.ID_EMPRESA, 'pendente', ?, ?
        FROM empresas e
        WHERE e.ID_EMPRESA IN ($placeholders)";

    $stmt_insert = $conn->prepare($sql_insert);
    $types = 'isi' . str_repeat('i', count($batch));
    $params = array_merge([$progress['id_pesquisa'], $progress['responsavel'], $progress['status_padrao']], $batch);
    $bind_params = [$types];
    foreach ($params as $key => $value) {
        $bind_params[] = &$params[$key];
    }
    call_user_func_array([$stmt_insert, 'bind_param'], $bind_params);
    $stmt_insert->execute();

    $sql_contatos = "INSERT INTO pesquisa_contatos (id_pesquisa_empresa_fk, id_contato_empresa_fk, nome, email, telefone, area)
        SELECT pe.id, c.idcontatos_empresa, c.nome, c.email, c.tel AS telefone,
            COALESCE(md_ok.nome_departamento, md_default.nome_departamento, '') AS area
        FROM pesquisa_empresa pe
        INNER JOIN contatos_empresa c ON c.id_empresa = pe.id_empresa_fk
        LEFT JOIN departamentos_modelos_itens md_ok
            ON md_ok.id_modelo_fk = ?
           AND md_ok.ativo = 'S'
           AND LOWER(TRIM(md_ok.nome_departamento)) = LOWER(TRIM(c.depto))
        LEFT JOIN departamentos_modelos_itens md_default
            ON md_default.id_item = (
                SELECT mdi2.id_item
                FROM departamentos_modelos_itens mdi2
                WHERE mdi2.id_modelo_fk = ? AND mdi2.ativo = 'S'
                ORDER BY mdi2.ordem ASC, mdi2.nome_departamento ASC
                LIMIT 1
            )
        WHERE pe.id_pesquisa_fk = ? AND pe.id_empresa_fk IN ($placeholders)";
    $stmt_contatos_insert = $conn->prepare($sql_contatos);
    $types_contatos = 'iii' . str_repeat('i', count($batch));
    $params_contatos = array_merge([$progress['id_modelo_departamento'], $progress['id_modelo_departamento'], $progress['id_pesquisa']], $batch);
    $bind_params_contatos = [$types_contatos];
    foreach ($params_contatos as $key => $value) {
        $bind_params_contatos[] = &$params_contatos[$key];
    }
    call_user_func_array([$stmt_contatos_insert, 'bind_param'], $bind_params_contatos);
    $stmt_contatos_insert->execute();

    $progress['index'] += count($batch);
    $_SESSION['pesquisa_progress'] = $progress;

    json_response(true, [
        'done' => $progress['index'] >= $total,
        'processed' => $progress['index'],
        'total' => $total
    ]);
}
?>
