<?php
/**
 * PRODUTOS HELPER - Cérebro Único de Salvamento
 * Checkout Pro 2025 - FASE 2: CORREÇÃO DO NÚCLEO DE PRODUTOS
 * 
 * Centraliza toda a lógica de salvamento de produtos, eliminando
 * duplicação de código entre Admin e Usuário e resolvendo problemas
 * de validação de colunas do banco de dados.
 * 
 * @version 1.0
 * @author Checkout Pro 2025
 */

// Garantir que config_db.php foi carregado
if (!isset($pdo) || !($pdo instanceof PDO)) {
    throw new Exception("Conexão com banco de dados não estabelecida. Carregue config_db.php primeiro.");
}

/**
 * Cache de colunas do banco (para performance)
 */
static $colunas_cache = null;

/**
 * Obtém lista de colunas da tabela produtos
 * 
 * @return array Lista de nomes de colunas
 */
function obterColunasProdutos() {
    global $colunas_cache, $pdo;
    
    // Usar cache se disponível
    if ($colunas_cache !== null) {
        return $colunas_cache;
    }
    
    try {
        $stmt = $pdo->query("SHOW COLUMNS FROM produtos");
        $colunas = $stmt->fetchAll(PDO::FETCH_COLUMN);
        $colunas_cache = $colunas;
        return $colunas;
    } catch (PDOException $e) {
        error_log("Erro ao obter colunas da tabela produtos: " . $e->getMessage());
        // Retornar lista mínima de colunas essenciais como fallback
        return ['id', 'nome', 'descricao', 'preco_atual', 'imagem', 'data_criacao'];
    }
}

/**
 * Sanitiza dados de produto
 * 
 * @param array $dados Dados brutos do formulário
 * @return array Dados sanitizados
 */
function sanitizarDadosProduto($dados) {
    $sanitizados = [];
    
    // Campos de texto - trim e escape
    $campos_texto = ['nome', 'descricao', 'categoria', 'link_pagamento', 'link_entregavel', 
                     'entrega_dados_titulo', 'entrega_dados_descricao', 'entrega_dados_acesso',
                     'entrega_dados_botao_texto', 'entrega_dados_botao_link',
                     'checkout_background_color', 'checkout_banner', 'checkout_main_card_background',
                     'checkout_text_color', 'provas_sociais', 'affiliate_material_url', 'sales_page_url',
                     'imagem']; // Campo imagem adicionado para ser processado corretamente
    
    foreach ($campos_texto as $campo) {
        if (isset($dados[$campo])) {
            $sanitizados[$campo] = trim($dados[$campo]);
        }
    }
    
    // Campos numéricos
    $campos_numericos = ['preco_original', 'preco_atual', 'frete_valor', 'frete_minimo_gratis',
                         'prazo_entrega_min', 'prazo_entrega_max', 'comissao_padrao'];
    
    foreach ($campos_numericos as $campo) {
        if (isset($dados[$campo])) {
            $valor = $dados[$campo];
            $sanitizados[$campo] = (!empty($valor) && is_numeric($valor)) ? floatval($valor) : null;
        }
    }
    
    // Campos inteiros
    $campos_inteiros = ['usuario_id', 'id'];
    
    foreach ($campos_inteiros as $campo) {
        if (isset($dados[$campo])) {
            $sanitizados[$campo] = intval($dados[$campo]);
        }
    }
    
    // Campos booleanos (checkbox)
    $campos_booleanos = ['is_marketplace', 'afiliacao_ativa', 'enable_sales_page'];
    
    foreach ($campos_booleanos as $campo) {
        $sanitizados[$campo] = isset($dados[$campo]) && ($dados[$campo] == '1' || $dados[$campo] === true) ? 1 : 0;
    }
    
    // Campos de enum/select - validar valores permitidos
    $validacoes = [
        'tipo_produto' => ['digital', 'fisico'],
        'frete_tipo' => ['gratis', 'fixo', 'minimo'],
        'metodos_pagamento' => ['todos', 'pix_cartao', 'pix'],
        'tipo_entrega' => ['link', 'dados_acesso', 'area_membros'],
        'status_produto' => ['ativo', 'inativo', 'rascunho']
    ];
    
    foreach ($validacoes as $campo => $valores_permitidos) {
        if (isset($dados[$campo])) {
            $valor = trim($dados[$campo]);
            if (in_array($valor, $valores_permitidos)) {
                $sanitizados[$campo] = $valor;
            } else {
                // Usar valor padrão
                $padroes = [
                    'tipo_produto' => 'digital',
                    'frete_tipo' => 'gratis',
                    'metodos_pagamento' => 'todos',
                    'tipo_entrega' => 'link',
                    'status_produto' => 'ativo'
                ];
                $sanitizados[$campo] = $padroes[$campo];
            }
        }
    }
    
    // Regra especial: produtos físicos não devem ter tipo_entrega
    if (isset($sanitizados['tipo_produto']) && $sanitizados['tipo_produto'] === 'fisico') {
        $sanitizados['tipo_entrega'] = null;
        // Produtos físicos não precisam de link_entregavel
        if (isset($sanitizados['link_entregavel'])) {
            $sanitizados['link_entregavel'] = null;
        }
    }
    
    return $sanitizados;
}

/**
 * Salva ou atualiza um produto no banco de dados
 * 
 * @param array $dados Dados do produto (do formulário POST)
 * @param int $usuario_id_logado ID do usuário logado
 * @param bool $eh_admin Se true, admin pode editar qualquer produto. Se false, só seus próprios.
 * @return array ['success' => bool, 'produto_id' => int|null, 'message' => string]
 */
function salvarProduto($dados, $usuario_id_logado, $eh_admin = false) {
    global $pdo;
    
    try {
        // Sanitizar dados
        $dados_limpos = sanitizarDadosProduto($dados);
        
        // Obter colunas disponíveis no banco
        $colunas_disponiveis = obterColunasProdutos();
        
        // Validar campos obrigatórios
        if (empty($dados_limpos['nome'])) {
            return ['success' => false, 'produto_id' => null, 'message' => 'Nome do produto é obrigatório.'];
        }
        
        if (!isset($dados_limpos['preco_atual']) || $dados_limpos['preco_atual'] <= 0) {
            return ['success' => false, 'produto_id' => null, 'message' => 'Preço atual deve ser maior que zero.'];
        }
        
        // Verificar se é UPDATE ou INSERT
        $is_update = isset($dados_limpos['id']) && $dados_limpos['id'] > 0;
        
        if ($is_update) {
            // ============================================================
            // UPDATE DE PRODUTO EXISTENTE
            // ============================================================
            
            $produto_id = $dados_limpos['id'];
            
            // Verificar permissões
            if (!$eh_admin) {
                // Usuário comum só pode editar seus próprios produtos
                $stmt_check = $pdo->prepare("SELECT usuario_id FROM produtos WHERE id = :id LIMIT 1");
                $stmt_check->execute([':id' => $produto_id]);
                $produto = $stmt_check->fetch(PDO::FETCH_ASSOC);
                
                if (!$produto) {
                    return ['success' => false, 'produto_id' => null, 'message' => 'Produto não encontrado.'];
                }
                
                if ($produto['usuario_id'] != $usuario_id_logado) {
                    return ['success' => false, 'produto_id' => null, 'message' => 'Você não tem permissão para editar este produto.'];
                }
            }
            
            // Montar query UPDATE dinamicamente apenas com colunas que existem
            $campos_update = [];
            $valores = [':id' => $produto_id];
            
            // Mapear campos para colunas do banco
            $mapeamento_campos = [
                'nome' => 'nome',
                'descricao' => 'descricao',
                'preco_original' => 'preco_original',
                'preco_atual' => 'preco_atual',
                'imagem' => 'imagem',
                'categoria' => 'categoria',
                'link_pagamento' => 'link_pagamento',
                'tipo_produto' => 'tipo_produto',
                'frete_tipo' => 'frete_tipo',
                'frete_valor' => 'frete_valor',
                'frete_minimo_gratis' => 'frete_minimo_gratis',
                'prazo_entrega_min' => 'prazo_entrega_min',
                'prazo_entrega_max' => 'prazo_entrega_max',
                'metodos_pagamento' => 'metodos_pagamento',
                'tipo_entrega' => 'tipo_entrega',
                'link_entregavel' => 'link_entregavel',
                'entrega_dados_titulo' => 'entrega_dados_titulo',
                'entrega_dados_descricao' => 'entrega_dados_descricao',
                'entrega_dados_acesso' => 'entrega_dados_acesso',
                'entrega_dados_botao_texto' => 'entrega_dados_botao_texto',
                'entrega_dados_botao_link' => 'entrega_dados_botao_link',
                'checkout_background_color' => 'checkout_background_color',
                'checkout_banner' => 'checkout_banner',
                'checkout_main_card_background' => 'checkout_main_card_background',
                'checkout_text_color' => 'checkout_text_color',
                'provas_sociais' => 'provas_sociais',
                'is_marketplace' => 'is_marketplace',
                'status_produto' => 'status_produto',
                'afiliacao_ativa' => 'afiliacao_ativa',
                'comissao_padrao' => 'comissao_padrao',
                'affiliate_material_url' => 'affiliate_material_url',
                'enable_sales_page' => 'enable_sales_page',
                'sales_page_url' => 'sales_page_url'
            ];
            
            foreach ($mapeamento_campos as $campo_dados => $coluna_banco) {
                // Verificar se coluna existe no banco
                if (!in_array($coluna_banco, $colunas_disponiveis)) {
                    continue; // Pular coluna que não existe
                }
                
                // Verificar se campo foi fornecido nos dados (array_key_exists verifica chave, não valor)
                if (array_key_exists($campo_dados, $dados_limpos)) {
                    $campos_update[] = "{$coluna_banco} = :{$campo_dados}";
                    // Para imagem e banner, garantir que sempre tenha um valor (mesmo que vazio)
                    if ($campo_dados === 'imagem' || $campo_dados === 'checkout_banner') {
                        $valores[":{$campo_dados}"] = $dados_limpos[$campo_dados] ?? '';
                    } else {
                        $valores[":{$campo_dados}"] = $dados_limpos[$campo_dados];
                    }
                }
            }
            
            // Log para debug (verificar se imagem está sendo incluída)
            if (isset($dados_limpos['imagem'])) {
                error_log("HELPER UPDATE: Produto ID {$produto_id} - Imagem presente: " . (isset($dados_limpos['imagem']) ? 'SIM' : 'NÃO') . " - Valor: " . (empty($dados_limpos['imagem']) ? 'VAZIO' : substr($dados_limpos['imagem'], 0, 80)));
            }
            
            // Adicionar data_atualizacao se coluna existir
            if (in_array('data_atualizacao', $colunas_disponiveis)) {
                $campos_update[] = "data_atualizacao = NOW()";
            }
            
            if (empty($campos_update)) {
                return ['success' => false, 'produto_id' => null, 'message' => 'Nenhum campo válido para atualizar.'];
            }
            
            // Montar query final
            $sql = "UPDATE produtos SET " . implode(', ', $campos_update);
            
            // Adicionar WHERE
            if ($eh_admin) {
                $sql .= " WHERE id = :id";
            } else {
                $sql .= " WHERE id = :id AND usuario_id = :usuario_id";
                $valores[':usuario_id'] = $usuario_id_logado;
            }
            
            $stmt = $pdo->prepare($sql);
            $stmt->execute($valores);
            
            // Verificar se atualizou alguma linha
            if ($stmt->rowCount() > 0) {
                return ['success' => true, 'produto_id' => $produto_id, 'message' => 'Produto atualizado com sucesso.'];
            } else {
                return ['success' => false, 'produto_id' => null, 'message' => 'Nenhuma alteração foi feita. Verifique se o produto existe.'];
            }
            
        } else {
            // ============================================================
            // INSERT DE NOVO PRODUTO
            // ============================================================
            
            // Garantir usuario_id
            if (!isset($dados_limpos['usuario_id']) || empty($dados_limpos['usuario_id'])) {
                $dados_limpos['usuario_id'] = $usuario_id_logado;
            }
            
            // Montar query INSERT dinamicamente apenas com colunas que existem
            $colunas_insert = [];
            $placeholders = [];
            $valores = [];
            
            // Campos obrigatórios
            $campos_obrigatorios = [
                'usuario_id' => $dados_limpos['usuario_id'],
                'nome' => $dados_limpos['nome'],
                'preco_atual' => $dados_limpos['preco_atual']
            ];
            
            foreach ($campos_obrigatorios as $campo => $valor) {
                if (in_array($campo, $colunas_disponiveis)) {
                    $colunas_insert[] = $campo;
                    $placeholders[] = ":{$campo}";
                    $valores[":{$campo}"] = $valor;
                }
            }
            
            // Campos opcionais
            $mapeamento_campos = [
                'descricao' => 'descricao',
                'preco_original' => 'preco_original',
                'imagem' => 'imagem',
                'categoria' => 'categoria',
                'link_pagamento' => 'link_pagamento',
                'tipo_produto' => 'tipo_produto',
                'frete_tipo' => 'frete_tipo',
                'frete_valor' => 'frete_valor',
                'frete_minimo_gratis' => 'frete_minimo_gratis',
                'prazo_entrega_min' => 'prazo_entrega_min',
                'prazo_entrega_max' => 'prazo_entrega_max',
                'metodos_pagamento' => 'metodos_pagamento',
                'tipo_entrega' => 'tipo_entrega',
                'link_entregavel' => 'link_entregavel',
                'entrega_dados_titulo' => 'entrega_dados_titulo',
                'entrega_dados_descricao' => 'entrega_dados_descricao',
                'entrega_dados_acesso' => 'entrega_dados_acesso',
                'entrega_dados_botao_texto' => 'entrega_dados_botao_texto',
                'entrega_dados_botao_link' => 'entrega_dados_botao_link',
                'checkout_background_color' => 'checkout_background_color',
                'checkout_banner' => 'checkout_banner',
                'checkout_main_card_background' => 'checkout_main_card_background',
                'checkout_text_color' => 'checkout_text_color',
                'provas_sociais' => 'provas_sociais',
                'is_marketplace' => 'is_marketplace',
                'status_produto' => 'status_produto',
                'afiliacao_ativa' => 'afiliacao_ativa',
                'comissao_padrao' => 'comissao_padrao',
                'affiliate_material_url' => 'affiliate_material_url',
                'enable_sales_page' => 'enable_sales_page',
                'sales_page_url' => 'sales_page_url'
            ];
            
            foreach ($mapeamento_campos as $campo_dados => $coluna_banco) {
                // Verificar se coluna existe no banco
                if (!in_array($coluna_banco, $colunas_disponiveis)) {
                    continue; // Pular coluna que não existe
                }
                
                // Verificar se campo foi fornecido e não é nulo
                if (array_key_exists($campo_dados, $dados_limpos) && $dados_limpos[$campo_dados] !== null) {
                    $colunas_insert[] = $coluna_banco;
                    $placeholders[] = ":{$campo_dados}";
                    $valores[":{$campo_dados}"] = $dados_limpos[$campo_dados];
                }
            }
            
            // Adicionar data_criacao se coluna existir
            if (in_array('data_criacao', $colunas_disponiveis)) {
                $colunas_insert[] = 'data_criacao';
                $placeholders[] = 'NOW()';
            }
            
            if (empty($colunas_insert)) {
                return ['success' => false, 'produto_id' => null, 'message' => 'Nenhum campo válido para inserir.'];
            }
            
            // Montar query final
            $sql = "INSERT INTO produtos (" . implode(', ', $colunas_insert) . ") VALUES (" . implode(', ', $placeholders) . ")";
            
            $stmt = $pdo->prepare($sql);
            $stmt->execute($valores);
            
            $novo_produto_id = $pdo->lastInsertId();
            
            if ($novo_produto_id > 0) {
                return ['success' => true, 'produto_id' => $novo_produto_id, 'message' => 'Produto criado com sucesso.'];
            } else {
                return ['success' => false, 'produto_id' => null, 'message' => 'Erro ao criar produto. ID não foi retornado.'];
            }
        }
        
    } catch (PDOException $e) {
        error_log("Erro ao salvar produto: " . $e->getMessage());
        error_log("SQL: " . ($sql ?? 'N/A'));
        error_log("Valores: " . print_r($valores ?? [], true));
        
        return [
            'success' => false,
            'produto_id' => null,
            'message' => 'Erro ao salvar produto: ' . $e->getMessage()
        ];
    } catch (Exception $e) {
        error_log("Erro geral ao salvar produto: " . $e->getMessage());
        
        return [
            'success' => false,
            'produto_id' => null,
            'message' => 'Erro ao salvar produto: ' . $e->getMessage()
        ];
    }
}

