<?php
header('Content-Type: application/json');
ini_set('display_errors', 0);
error_reporting(E_ALL);

require_once __DIR__ . '/../includes/funcoes.php';

$pdo = conectarBanco();
if (!$pdo) {
    http_response_code(500);
    echo json_encode(['sucesso' => false, 'erro' => 'Erro na conexão com o banco']);
    exit;
}

$input = file_get_contents('php://input');
$dados = json_decode($input, true);

if (!$dados) {
    http_response_code(400);
    echo json_encode(['sucesso' => false, 'erro' => 'Dados não recebidos']);
    exit;
}

$id = isset($dados['id']) ? (int)$dados['id'] : 0;
$enviarAgora = isset($dados['enviar_agora']) ? $dados['enviar_agora'] : false;

// Extrair dados das estruturas aninhadas (igual seu outro arquivo)
$empresa_id = isset($dados['empresa_id']) ? (int)$dados['empresa_id'] : 0;
$emitente_id = isset($dados['emitente']['id']) ? (int)$dados['emitente']['id'] : 0;
$tomador_id = isset($dados['tomador']['id']) ? (int)$dados['tomador']['id'] : 0;

// Validar dados obrigatórios
if (empty($empresa_id)) {
    echo json_encode(['sucesso' => false, 'erro' => 'Empresa não informada']);
    exit;
}
if (empty($emitente_id)) {
    echo json_encode(['sucesso' => false, 'erro' => 'Emitente não informado']);
    exit;
}
if (empty($tomador_id)) {
    echo json_encode(['sucesso' => false, 'erro' => 'Tomador não informado']);
    exit;
}

// Extrair dados da nota
$nota = isset($dados['nota']) ? $dados['nota'] : $dados;
$ref = isset($nota['ref']) ? $nota['ref'] : (isset($dados['ref']) ? $dados['ref'] : '');
$codigo_servico = isset($nota['codigo_servico']) ? $nota['codigo_servico'] : (isset($dados['codigo_servico']) ? $dados['codigo_servico'] : '');
$valor_servico = isset($nota['valor_servico']) ? (float)$nota['valor_servico'] : (isset($dados['valor_servico']) ? (float)$dados['valor_servico'] : 0);
$descricao = isset($nota['descricao']) ? $nota['descricao'] : (isset($dados['descricao']) ? $dados['descricao'] : '');
$aliquota = isset($nota['aliquota']) ? (float)$nota['aliquota'] : (isset($dados['aliquota']) ? (float)$dados['aliquota'] : 0);
$tipo_retencao_iss = isset($nota['tipo_retencao_iss']) ? (int)$nota['tipo_retencao_iss'] : (isset($dados['tipo_retencao_iss']) ? (int)$dados['tipo_retencao_iss'] : 0);
$regime_tributario = isset($nota['regime_tributario']) ? (int)$nota['regime_tributario'] : (isset($dados['regime_tributario']) ? (int)$dados['regime_tributario'] : 0);
$codigo_tributario_municipal = isset($nota['codigo_tributario_municipal']) ? $nota['codigo_tributario_municipal'] : (isset($dados['codigo_tributario_municipal']) ? $dados['codigo_tributario_municipal'] : '');
$codigo_nbs = isset($nota['codigo_nbs']) ? $nota['codigo_nbs'] : (isset($dados['codigo_nbs']) ? $dados['codigo_nbs'] : '');
$data_emissao = isset($nota['data_emissao']) ? $nota['data_emissao'] : (isset($dados['data_emissao']) ? $dados['data_emissao'] : date('Y-m-d H:i:s'));
$data_competencia = isset($nota['data_competencia']) ? $nota['data_competencia'] : (isset($dados['data_competencia']) ? $dados['data_competencia'] : date('Y-m-d'));
$observacoes = isset($nota['observacoes']) ? $nota['observacoes'] : (isset($dados['observacoes']) ? $dados['observacoes'] : '');

// Calcular valores
$iss_retido = ($tipo_retencao_iss == 2 || $tipo_retencao_iss == 3) ? 1 : 0;
$valor_iss = ($valor_servico * $aliquota) / 100;

// Converter regime tributario para optante_simples_nacional (tinyint)
// Conforme sua tabela: 0=Não optante, 1=Optante SN
$optante_simples_nacional = ($regime_tributario == 3) ? 1 : 0;

if (empty($ref)) {
    echo json_encode(['sucesso' => false, 'erro' => 'Referência não informada']);
    exit;
}
if (empty($codigo_servico)) {
    echo json_encode(['sucesso' => false, 'erro' => 'Código do serviço não informado']);
    exit;
}
if (empty($valor_servico) || $valor_servico <= 0) {
    echo json_encode(['sucesso' => false, 'erro' => 'Valor do serviço inválido']);
    exit;
}

// Buscar dados da empresa
$stmt = $pdo->prepare("SELECT token, ambiente, optante_simples FROM empresas WHERE id = ? AND ativo = 1");
$stmt->execute([$empresa_id]);
$empresa = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$empresa) {
    echo json_encode(['sucesso' => false, 'erro' => 'Empresa não encontrada ou inativa']);
    exit;
}

// Buscar dados do emitente
$stmt = $pdo->prepare("
    SELECT e.*, end.codigo_municipio, end.uf 
    FROM emitentes e 
    LEFT JOIN enderecos end ON e.endereco_id = end.id 
    WHERE e.id = ? AND e.ativo = 1
");
$stmt->execute([$emitente_id]);
$emitente_completo = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$emitente_completo) {
    echo json_encode(['sucesso' => false, 'erro' => 'Emitente não encontrado ou inativo']);
    exit;
}

// Buscar dados do tomador
$stmt = $pdo->prepare("
    SELECT t.*, end.logradouro, end.numero, end.bairro, end.codigo_municipio, end.uf, end.cep
    FROM tomadores t 
    LEFT JOIN enderecos end ON t.endereco_id = end.id 
    WHERE t.id = ? AND t.ativo = 1
");
$stmt->execute([$tomador_id]);
$tomador_completo = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$tomador_completo) {
    echo json_encode(['sucesso' => false, 'erro' => 'Tomador não encontrado ou inativo']);
    exit;
}

// Preparar payload completo para salvar
$payload = [
    'empresa_id' => $empresa_id,
    'emitente' => $emitente_completo,
    'tomador' => $tomador_completo,
    'nota' => [
        'ref' => $ref,
        'codigo_servico' => $codigo_servico,
        'valor_servico' => $valor_servico,
        'descricao' => $descricao,
        'aliquota' => $aliquota,
        'valor_iss' => $valor_iss,
        'iss_retido' => $iss_retido,
        'optante_simples_nacional' => $optante_simples_nacional,
        'tipo_retencao_iss' => $tipo_retencao_iss,
        'regime_tributario' => $regime_tributario,
        'codigo_tributario_municipal' => $codigo_tributario_municipal,
        'codigo_nbs' => $codigo_nbs,
        'data_emissao' => $data_emissao,
        'data_competencia' => $data_competencia,
        'observacoes' => $observacoes
    ]
];

$status = $enviarAgora ? 'pendente' : 'rascunho';

try {
    $pdo->beginTransaction();
    
    // Verificar duplicidade de ref
    $stmt = $pdo->prepare("SELECT id FROM notas_fiscais WHERE ref = ? AND id != ?");
    $stmt->execute([$ref, $id]);
    if ($stmt->fetch()) {
        throw new Exception('Já existe uma nota com a referência "' . $ref . '"');
    }
    
    if ($id > 0) {
        // UPDATE - usando APENAS colunas que existem
        $stmt = $pdo->prepare("
            UPDATE notas_fiscais 
            SET empresa_id = ?, emitente_id = ?, tomador_id = ?, ref = ?, 
                codigo_servico = ?, discriminacao_servico = ?, valor_servico = ?, 
                aliquota = ?, valor_iss = ?, iss_retido = ?,
                optante_simples_nacional = ?,
                data_emissao = ?, data_competencia = ?, status = ?,
                payload_enviado = ?, atualizado_em = NOW()
            WHERE id = ?
        ");
        $stmt->execute([
            $empresa_id, $emitente_id, $tomador_id, $ref,
            $codigo_servico, $descricao, $valor_servico,
            $aliquota, $valor_iss, $iss_retido,
            $optante_simples_nacional,
            $data_emissao, $data_competencia, $status,
            json_encode($payload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE), 
            $id
        ]);
        $nota_id = $id;
    } else {
        // INSERT - usando APENAS colunas que existem
        $stmt = $pdo->prepare("
            INSERT INTO notas_fiscais 
            (empresa_id, emitente_id, tomador_id, ref, codigo_servico, discriminacao_servico, 
             valor_servico, aliquota, valor_iss, iss_retido, optante_simples_nacional,
             data_emissao, data_competencia, status, payload_enviado, criado_em)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())
        ");
        $stmt->execute([
            $empresa_id, $emitente_id, $tomador_id, $ref,
            $codigo_servico, $descricao, $valor_servico,
            $aliquota, $valor_iss, $iss_retido, $optante_simples_nacional,
            $data_emissao, $data_competencia, $status,
            json_encode($payload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
        ]);
        $nota_id = $pdo->lastInsertId();
    }
    
    $pdo->commit();
    
    $response = [
        'sucesso' => true,
        'mensagem' => $enviarAgora ? 'Nota enviada para processamento' : 'Rascunho salvo com sucesso',
        'nota_id' => $nota_id
    ];
    
    // Se for para enviar agora, chamar a API Focus
    if ($enviarAgora) {
        // Aqui você pode chamar a função de envio para Focus
        // Ou redirecionar para o processamento
        $response['redirect'] = 'processar_nota.php?id=' . $nota_id;
    }
    
    echo json_encode($response);
    
} catch (Exception $e) {
    $pdo->rollBack();
    echo json_encode([
        'sucesso' => false,
        'erro' => $e->getMessage()
    ]);
}

exit;
?>