<?php
session_start();
require_once 'conexao.php';

// Verificar se usuário está logado
if (!isset($_SESSION['logado']) || $_SESSION['logado'] !== true) {
    die(json_encode(['success' => false, 'message' => 'Usuário não logado']));
}

// Obter dados do POST como JSON
$input = file_get_contents('php://input');
$dados = json_decode($input, true);

if (json_last_error() !== JSON_ERROR_NONE) {
    die(json_encode(['success' => false, 'message' => 'Dados JSON inválidos']));
}

// Verificar CSRF token
if (!isset($dados['csrf_token']) || empty($dados['csrf_token'])) {
    die(json_encode(['success' => false, 'message' => 'Token CSRF não enviado']));
}

if (!isset($_SESSION['csrf_token']) || empty($_SESSION['csrf_token'])) {
    die(json_encode(['success' => false, 'message' => 'Token CSRF da sessão não encontrado']));
}

if ($dados['csrf_token'] !== $_SESSION['csrf_token']) {
    die(json_encode(['success' => false, 'message' => 'Token CSRF inválido']));
}

$cliente_id = $dados['id'] ?? null;
$nova_etapa_id = $dados['etapa_id'] ?? null;
$tipo_movimento = $dados['tipo_movimento'] ?? 'manual'; // ✅ NOVO: Identificar tipo de movimento
$tenant_id = $_SESSION['tenant_id'];
$usuario_id = $_SESSION['usuario_id'];
$nome_usuario = $_SESSION['nome_usuario'] ?? 'Usuário';

if (!$cliente_id || !$nova_etapa_id) {
    echo json_encode(['success' => false, 'message' => 'Dados insuficientes']);
    exit;
}

try {
    $conn->begin_transaction();

    // 1. Obter informações atuais do cliente
    $stmt_info = $conn->prepare("
        SELECT c.etapa_funil_id as etapa_anterior, 
               c.Nome_Cliente as cliente_nome,
               c.Email as cliente_email,
               c.responsavel,
               f.nome as funil_anterior_nome,
               ef.nome as etapa_anterior_nome,
               f.id as funil_anterior_id
        FROM clientes c
        LEFT JOIN etapas_funis ef ON c.etapa_funil_id = ef.id
        LEFT JOIN funis f ON ef.funil_id = f.id
        WHERE c.id = ? AND c.tenant_id = ?
    ");
    $stmt_info->bind_param("ii", $cliente_id, $tenant_id);
    $stmt_info->execute();
    $cliente_info = $stmt_info->get_result()->fetch_assoc();
    $stmt_info->close();

    if (!$cliente_info) {
        throw new Exception("Cliente não encontrado");
    }

    $etapa_anterior_id = $cliente_info['etapa_anterior'];
    $cliente_nome = $cliente_info['cliente_nome'];
    $cliente_email = $cliente_info['cliente_email'];
    $responsavel_id = $cliente_info['responsavel'];
    $funil_anterior_nome = $cliente_info['funil_anterior_nome'] ?? 'Não definido';
    $etapa_anterior_nome = $cliente_info['etapa_anterior_nome'] ?? 'Não definida';
    $funil_anterior_id = $cliente_info['funil_anterior_id'];

    // 2. Obter informações da nova etapa
    $stmt_nova_etapa = $conn->prepare("
        SELECT ef.nome as nova_etapa_nome, 
               f.nome as novo_funil_nome, 
               f.id as novo_funil_id,
               ef.tipo_entrada
        FROM etapas_funis ef
        LEFT JOIN funis f ON ef.funil_id = f.id
        WHERE ef.id = ? AND f.tenant_id = ?
    ");
    $stmt_nova_etapa->bind_param("ii", $nova_etapa_id, $tenant_id);
    $stmt_nova_etapa->execute();
    $nova_etapa_result = $stmt_nova_etapa->get_result();
    
    if ($nova_etapa_result->num_rows === 0) {
        throw new Exception("Etapa não encontrada ou não pertence ao seu tenant");
    }
    
    $nova_etapa_info = $nova_etapa_result->fetch_assoc();
    $stmt_nova_etapa->close();

    $nova_etapa_nome = $nova_etapa_info['nova_etapa_nome'] ?? 'Não definida';
    $novo_funil_nome = $nova_etapa_info['novo_funil_nome'] ?? 'Não definido';
    $novo_funil_id = $nova_etapa_info['novo_funil_id'];
    $tipo_entrada_etapa = $nova_etapa_info['tipo_entrada'] ?? 'manual';

    // 3. Atualizar a etapa do cliente
    $stmt_update = $conn->prepare("UPDATE clientes SET etapa_funil_id = ? WHERE id = ? AND tenant_id = ?");
    $stmt_update->bind_param("iii", $nova_etapa_id, $cliente_id, $tenant_id);
    
    if (!$stmt_update->execute()) {
        throw new Exception("Erro ao atualizar etapa do cliente: " . $stmt_update->error);
    }
    
    $rows_affected = $stmt_update->affected_rows;
    $stmt_update->close();

    if ($rows_affected === 0) {
        throw new Exception("Nenhum cliente foi atualizado - verifique se o cliente existe e pertence ao seu tenant");
    }

    // 4. Criar uma observação para o log
    $tipo_movimento_texto = $tipo_movimento === 'agendamento' ? 'via agendamento' : 'manual';
    $observacao_texto = "Cliente movido de '{$etapa_anterior_nome}' para '{$nova_etapa_nome}' no funil '{$novo_funil_nome}' ({$tipo_movimento_texto})";
    
    $stmt_observacao = $conn->prepare("
        INSERT INTO cliente_observacoes 
        (cliente_id, usuario_id, observacao, data_cadastro) 
        VALUES (?, ?, ?, NOW())
    ");
    $stmt_observacao->bind_param("iis", $cliente_id, $usuario_id, $observacao_texto);
    
    if (!$stmt_observacao->execute()) {
        throw new Exception("Erro ao criar observação: " . $stmt_observacao->error);
    }
    $observacao_id = $conn->insert_id;
    $stmt_observacao->close();

    // 5. Registrar no cliente_logs com observacao_id válido
    $acao = 'movimentacao_etapa';
    $detalhes = "Cliente '{$cliente_nome}' movido de '{$etapa_anterior_nome}' para '{$nova_etapa_nome}' no funil '{$novo_funil_nome}' ({$tipo_movimento_texto})";
    
    $stmt_log = $conn->prepare("
        INSERT INTO cliente_logs 
        (cliente_id, usuario_id, nome_usuario, acao, detalhes, tenant_id, observacao_id, atividade_id) 
        VALUES (?, ?, ?, ?, ?, ?, ?, NULL)
    ");
    
    $stmt_log->bind_param("iisssii", $cliente_id, $usuario_id, $nome_usuario, $acao, $detalhes, $tenant_id, $observacao_id);
    
    if (!$stmt_log->execute()) {
        throw new Exception("Erro ao registrar log: " . $stmt_log->error);
    }
    $log_id = $conn->insert_id;
    $stmt_log->close();

    $conn->commit();

    // 6. ⭐⭐ VERIFICAR FLUXOS AUTOMATIZADOS APÓS MUDANÇA DE ETAPA ⭐⭐
    $atividades_criadas = 0;
    $fluxos_acionados = [];
    
    if (file_exists('verificador_fluxos_automatizados.php')) {
        require_once 'verificador_fluxos_automatizados.php';
        
        // Verificar se a função existe
        if (!function_exists('criarAtividadesPorFluxo')) {
            error_log("❌ Função criarAtividadesPorFluxo não encontrada no verificador");
        } else {
            // ✅ Dados completos do cliente para o verificador - INCLUINDO TIPO_MOVIMENTO
            $dados_cliente = [
                'etapa_funil_id' => $nova_etapa_id,
                'etapa_anterior_id' => $etapa_anterior_id,
                'funil_id' => $novo_funil_id,
                'tenant_id' => $tenant_id,
                'cliente_id' => $cliente_id,
                'cliente_nome' => $cliente_nome,
                'cliente_email' => $cliente_email,
                'responsavel_id' => $responsavel_id,
                'movimentado_por' => $usuario_id,
                'tipo_movimento' => $tipo_movimento, // ✅ CRÍTICO: Identificar tipo de movimento
                'tipo_entrada_etapa' => $tipo_entrada_etapa
            ];
            
            // Executar verificação de fluxos para mudança de etapa
            $atividades_criadas = criarAtividadesPorFluxo(
                $conn, 
                'cliente_etapa_alterada',
                $cliente_id,
                $dados_cliente
            );
            
            // Log detalhado para debugging
            error_log("🎯 FLUXOS AUTOMATIZADOS: Cliente {$cliente_id} ({$cliente_nome}) movido para etapa {$nova_etapa_id} via {$tipo_movimento} - {$atividades_criadas} atividades criadas");
            
            if ($atividades_criadas > 0) {
                // Buscar informações sobre os fluxos acionados para o log
                $stmt_fluxos = $conn->prepare("
                    SELECT id, nome FROM fluxos_automatizados 
                    WHERE tenant_id = ? AND ativo = 1 
                    AND JSON_CONTAINS(condicoes, JSON_OBJECT('tipo', 'etapa_funil'))
                    AND JSON_EXTRACT(condicoes, '$[0].etapa_funil_id') = ?
                ");
                $stmt_fluxos->bind_param("ii", $tenant_id, $nova_etapa_id);
                $stmt_fluxos->execute();
                $result_fluxos = $stmt_fluxos->get_result();
                
                while ($fluxo = $result_fluxos->fetch_assoc()) {
                    $fluxos_acionados[] = $fluxo['nome'];
                }
                $stmt_fluxos->close();
                
                // ✅ Buscar também fluxos por agendamento se aplicável
                if ($tipo_movimento === 'agendamento') {
                    $stmt_fluxos_agendamento = $conn->prepare("
                        SELECT id, nome FROM fluxos_automatizados 
                        WHERE tenant_id = ? AND ativo = 1 
                        AND JSON_CONTAINS(condicoes, JSON_OBJECT('tipo', 'agendamento'))
                        AND JSON_EXTRACT(condicoes, '$[0].etapa_agendamento_id') = ?
                    ");
                    $stmt_fluxos_agendamento->bind_param("ii", $tenant_id, $nova_etapa_id);
                    $stmt_fluxos_agendamento->execute();
                    $result_fluxos_agendamento = $stmt_fluxos_agendamento->get_result();
                    
                    while ($fluxo_agendamento = $result_fluxos_agendamento->fetch_assoc()) {
                        $fluxos_acionados[] = $fluxo_agendamento['nome'] . " (agendamento)";
                    }
                    $stmt_fluxos_agendamento->close();
                }
            }
        }
    } else {
        error_log("⚠️ AVISO: Arquivo verificador_fluxos_automatizados.php não encontrado");
    }

    // 7. Resposta com informações completas
    $response = [
        'success' => true, 
        'message' => 'Etapa atualizada com sucesso',
        'log_id' => $log_id,
        'observacao_id' => $observacao_id,
        'atividades_criadas' => $atividades_criadas,
        'tipo_movimento' => $tipo_movimento, // ✅ Incluir tipo de movimento na resposta
        'detalhes' => [
            'cliente' => $cliente_nome,
            'etapa_anterior' => $etapa_anterior_nome,
            'etapa_nova' => $nova_etapa_nome,
            'funil' => $novo_funil_nome,
            'tipo_movimento' => $tipo_movimento,
            'tipo_entrada_etapa' => $tipo_entrada_etapa
        ]
    ];
    
    // Adicionar informações de fluxos se houver
    if (!empty($fluxos_acionados)) {
        $response['fluxos_acionados'] = $fluxos_acionados;
        $response['message'] .= ' e ' . $atividades_criadas . ' atividade(s) automatizada(s) criada(s)';
    }
    
    echo json_encode($response);

} catch (Exception $e) {
    if (isset($conn)) {
        $conn->rollback();
    }
    error_log("❌ ERRO em atualizar_status.php: " . $e->getMessage());
    
    echo json_encode([
        'success' => false, 
        'message' => $e->getMessage(),
        'atividades_criadas' => 0
    ]);
}

// Fechar conexão
if (isset($conn) && $conn->ping()) {
    $conn->close();
}
?>