<?php
// api_webphone.php - VERSÃO CORRIGIDA COM LIMITE DE 200

session_start();
require_once 'conexao.php';

header('Content-Type: application/json');

// Configurações da Zenvia
define('ZENVIA_API_URL', 'https://voice-api.zenvia.com');
define('ZENVIA_TOKEN', 'bac7690d70ce44e43906b9069562c47f'); // Token válido
define('ZENVIA_TIMEOUT', 10);
define('ZENVIA_LIMITE_MAX', 200); // Limite máximo da API

class WebphoneAPI {
    private $conn;
    private $tenant_id;
    private $usuario_id;
    
    public function __construct($conn) {
        $this->conn = $conn;
        $this->autenticarUsuario();
    }
    
    private function autenticarUsuario() {
        if (!isset($_SESSION['usuario_id']) || !isset($_SESSION['tenant_id'])) {
            $this->erro('Usuário não autenticado', 401);
        }
        
        $this->usuario_id = $_SESSION['usuario_id'];
        $this->tenant_id = $_SESSION['tenant_id'];
    }
    
    private function erro($mensagem, $codigo = 400) {
        http_response_code($codigo);
        echo json_encode(['success' => false, 'error' => $mensagem]);
        exit;
    }
    
    private function sucesso($dados = []) {
        echo json_encode(array_merge(['success' => true], $dados));
        exit;
    }
    
    // ========== INTEGRAÇÃO COM ZENVIA ==========
    
    private function consultarZenvia($endpoint) {
        $ch = curl_init();
        
        $url = ZENVIA_API_URL . $endpoint;
        
        $headers = [
            'Access-Token: ' . ZENVIA_TOKEN,
            'Content-Type: application/json'
        ];
        
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_TIMEOUT, ZENVIA_TIMEOUT);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        
        $resposta = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $erro = curl_error($ch);
        curl_close($ch);
        
        if ($erro) {
            return [
                'code' => 500,
                'error' => $erro,
                'data' => null
            ];
        }
        
        return [
            'code' => $httpCode,
            'data' => json_decode($resposta, true),
            'error' => null
        ];
    }
    
    // ========== CONFIGURAÇÕES DO WEBPHONE ==========
    
    public function getWebphoneConfig() {
        try {
            $stmt = $this->conn->prepare("
                SELECT cw.*, u.nome, u.email, u.telefone as bina_usuario,
                       cs.saldo_atual
                FROM config_webphone cw
                JOIN usuarios u ON u.id = cw.usuario_id
                LEFT JOIN creditos_tenant cs ON cs.tenant_id = cw.tenant_id
                WHERE cw.tenant_id = ? AND cw.usuario_id = ? AND cw.ativo = 1
            ");
            
            $stmt->bind_param("ii", $this->tenant_id, $this->usuario_id);
            $stmt->execute();
            $result = $stmt->get_result();
            $config = $result->fetch_assoc();
            $stmt->close();
            
            if (!$config) {
                // Criar configuração padrão
                $bina = $this->buscarBinaUsuario();
                $ramal = '4' . str_pad($this->usuario_id, 3, '0', STR_PAD_LEFT);
                
                $insert = $this->conn->prepare("
                    INSERT INTO config_webphone 
                    (tenant_id, usuario_id, bina_padrao, ramal, webphone_key, ativo)
                    VALUES (?, ?, ?, ?, 'd791f72e8cdf3d018548e2fc9b687ce9', 1)
                ");
                $insert->bind_param("iiss", $this->tenant_id, $this->usuario_id, $bina, $ramal);
                $insert->execute();
                $insert->close();
                
                $config = [
                    'bina_padrao' => $bina,
                    'ramal' => $ramal,
                    'webphone_key' => 'd791f72e8cdf3d018548e2fc9b687ce9',
                    'nome' => $this->buscarNomeUsuario(),
                    'email' => $this->buscarEmailUsuario(),
                    'saldo_atual' => $this->buscarSaldo()
                ];
            }
            
            $this->sucesso([
                'config' => [
                    'bina' => $config['bina_padrao'],
                    'ramal' => $config['ramal'],
                    'nome_usuario' => $config['nome'],
                    'email' => $config['email'],
                    'saldo' => number_format($config['saldo_atual'] ?? 0, 2, ',', '.'),
                    'webphone_key' => $config['webphone_key']
                ]
            ]);
            
        } catch (Exception $e) {
            $this->erro('Erro ao carregar configurações: ' . $e->getMessage());
        }
    }
    
    public function getWebphoneUrl() {
        try {
            $tipo = $_GET['tipo'] ?? 'embedded';
            
            $stmt = $this->conn->prepare("
                SELECT webphone_key, bina_padrao, ramal 
                FROM config_webphone 
                WHERE tenant_id = ? AND usuario_id = ? AND ativo = 1
            ");
            $stmt->bind_param("ii", $this->tenant_id, $this->usuario_id);
            $stmt->execute();
            $result = $stmt->get_result();
            $config = $result->fetch_assoc();
            $stmt->close();
            
            if (!$config) {
                $this->erro('Configuração de webphone não encontrada');
            }
            
            $base_url = 'https://webphone.zenvia.com/';
            $params = http_build_query([
                'key' => $config['webphone_key'],
                'user' => $config['ramal'],
                'displayName' => $this->buscarNomeUsuario(),
                'callerId' => $config['bina_padrao']
            ]);
            
            $url = $base_url . ($tipo === 'embedded' ? 'embedded?' : '?') . $params;
            
            $this->sucesso(['url' => $url]);
            
        } catch (Exception $e) {
            $this->erro('Erro ao gerar URL: ' . $e->getMessage());
        }
    }
    
    // ========== FUNÇÕES PARA RELATÓRIOS ==========
    
    public function getHistoricoZenvia() {
        try {
            $data_inicio = $_GET['data_inicio'] ?? date('Y-m-d', strtotime('-30 days'));
            $data_fim = $_GET['data_fim'] ?? date('Y-m-d');
            $limite = $_GET['limite'] ?? 200;
            
            // Garantir que o limite não ultrapasse o máximo da API
            $limite = min(intval($limite), ZENVIA_LIMITE_MAX);
            
            // Validar datas
            if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $data_inicio) || !preg_match('/^\d{4}-\d{2}-\d{2}$/', $data_fim)) {
                $this->erro('Formato de data inválido. Use YYYY-MM-DD');
            }
            
            // Consultar API da Zenvia
            $resultado = $this->consultarZenvia("/chamada/relatorio?data_inicio={$data_inicio}&data_fim={$data_fim}&limite={$limite}");
            
            if ($resultado['code'] != 200) {
                $mensagem = $resultado['data']['mensagem'] ?? 'Erro desconhecido';
                $this->erro('Erro ao consultar Zenvia: HTTP ' . $resultado['code'] . ' - ' . $mensagem);
            }
            
            if (isset($resultado['data']['dados']['relatorio'])) {
                $chamadas = $resultado['data']['dados']['relatorio'];
                
                $chamadas_formatadas = [];
                foreach ($chamadas as $chamada) {
                    $chamadas_formatadas[] = [
                        'id' => $chamada['id'],
                        'data' => $chamada['data_criacao'],
                        'origem' => $chamada['origem']['numero'] ?? '-',
                        'destino' => $chamada['destino']['numero'] ?? '-',
                        'duracao' => $chamada['destino']['duracao'] ?? '00:00',
                        'duracao_segundos' => $chamada['destino']['duracao_segundos'] ?? 0,
                        'status' => $chamada['destino']['status'] ?? 'desconhecido',
                        'preco' => $chamada['destino']['preco'] ?? 0
                    ];
                }
                
                $this->sucesso([
                    'chamadas' => $chamadas_formatadas,
                    'total' => count($chamadas_formatadas),
                    'limite_usado' => $limite,
                    'limite_maximo' => ZENVIA_LIMITE_MAX,
                    'fonte' => 'zenvia'
                ]);
            } else {
                $this->sucesso([
                    'chamadas' => [], 
                    'total' => 0, 
                    'limite_usado' => $limite,
                    'limite_maximo' => ZENVIA_LIMITE_MAX,
                    'fonte' => 'zenvia',
                    'mensagem' => 'Nenhuma chamada encontrada no período'
                ]);
            }
            
        } catch (Exception $e) {
            $this->erro('Erro ao buscar histórico: ' . $e->getMessage());
        }
    }
    
    public function getEstatisticasZenvia() {
        try {
            $data_inicio = $_GET['data_inicio'] ?? date('Y-m-d', strtotime('-30 days'));
            $data_fim = $_GET['data_fim'] ?? date('Y-m-d');
            
            // Validar datas
            if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $data_inicio) || !preg_match('/^\d{4}-\d{2}-\d{2}$/', $data_fim)) {
                $this->erro('Formato de data inválido. Use YYYY-MM-DD');
            }
            
            // Consultar API da Zenvia com limite máximo
            $resultado = $this->consultarZenvia("/chamada/relatorio?data_inicio={$data_inicio}&data_fim={$data_fim}&limite=" . ZENVIA_LIMITE_MAX);
            
            if ($resultado['code'] != 200) {
                $mensagem = $resultado['data']['mensagem'] ?? 'Erro desconhecido';
                $this->erro('Erro ao consultar Zenvia: HTTP ' . $resultado['code'] . ' - ' . $mensagem);
            }
            
            if (isset($resultado['data']['dados']['relatorio'])) {
                $chamadas = $resultado['data']['dados']['relatorio'];
                
                $estatisticas = [
                    'total' => count($chamadas),
                    'atendidas' => 0,
                    'nao_atendidas' => 0,
                    'ocupado' => 0,
                    'falhas' => 0,
                    'duracao_total' => 0,
                    'custo_total' => 0
                ];
                
                foreach ($chamadas as $chamada) {
                    $status = $chamada['destino']['status'] ?? 'desconhecido';
                    $duracao = $chamada['destino']['duracao_segundos'] ?? 0;
                    $custo = $chamada['destino']['preco'] ?? 0;
                    
                    switch ($status) {
                        case 'atendida':
                            $estatisticas['atendidas']++;
                            $estatisticas['duracao_total'] += $duracao;
                            $estatisticas['custo_total'] += $custo;
                            break;
                        case 'sem resposta':
                            $estatisticas['nao_atendidas']++;
                            break;
                        case 'ocupado':
                            $estatisticas['ocupado']++;
                            break;
                        case 'falha':
                        case 'cancelada':
                            $estatisticas['falhas']++;
                            break;
                        default:
                            $estatisticas['nao_atendidas']++;
                    }
                }
                
                $this->sucesso([
                    'estatisticas' => $estatisticas,
                    'periodo' => [
                        'inicio' => $data_inicio,
                        'fim' => $data_fim
                    ],
                    'observacao' => 'Resultados limitados às últimas ' . ZENVIA_LIMITE_MAX . ' chamadas'
                ]);
            } else {
                $this->sucesso([
                    'estatisticas' => [
                        'total' => 0,
                        'atendidas' => 0,
                        'nao_atendidas' => 0,
                        'ocupado' => 0,
                        'falhas' => 0,
                        'duracao_total' => 0,
                        'custo_total' => 0
                    ],
                    'periodo' => [
                        'inicio' => $data_inicio,
                        'fim' => $data_fim
                    ]
                ]);
            }
            
        } catch (Exception $e) {
            $this->erro('Erro ao buscar estatísticas: ' . $e->getMessage());
        }
    }
    
    public function getHistoricoLocal() {
        try {
            $limite = $_GET['limite'] ?? 100;
            $limite = min(intval($limite), 500); // Limite local maior
            
            $sql = "
                SELECT c.*, u.nome as usuario_nome, cl.Nome_Cliente as cliente_nome
                FROM chamadas_telefonicas c
                JOIN usuarios u ON u.id = c.usuario_id
                LEFT JOIN clientes cl ON cl.id = c.cliente_id
                WHERE c.tenant_id = ?
                ORDER BY c.data_hora_inicio DESC
                LIMIT ?
            ";
            
            $stmt = $this->conn->prepare($sql);
            $stmt->bind_param("ii", $this->tenant_id, $limite);
            $stmt->execute();
            $result = $stmt->get_result();
            
            $chamadas = [];
            while ($row = $result->fetch_assoc()) {
                $chamadas[] = $row;
            }
            $stmt->close();
            
            $this->sucesso([
                'chamadas' => $chamadas,
                'total' => count($chamadas),
                'fonte' => 'local'
            ]);
            
        } catch (Exception $e) {
            $this->erro('Erro ao buscar histórico local: ' . $e->getMessage());
        }
    }
    
    public function testarConexaoZenvia() {
        try {
            // Tenta consultar uma chamada recente para testar o token
            $data_inicio = date('Y-m-d', strtotime('-1 day'));
            $data_fim = date('Y-m-d');
            
            $resultado = $this->consultarZenvia("/chamada/relatorio?data_inicio={$data_inicio}&data_fim={$data_fim}&limite=1");
            
            if ($resultado['code'] == 200) {
                $this->sucesso([
                    'status' => 'ok',
                    'message' => 'Conexão com Zenvia estabelecida com sucesso'
                ]);
            } elseif ($resultado['code'] == 401) {
                $this->erro('Token inválido. Verifique suas credenciais no painel da Zenvia.');
            } else {
                $mensagem = $resultado['data']['mensagem'] ?? 'Erro desconhecido';
                $this->erro('Erro na conexão: HTTP ' . $resultado['code'] . ' - ' . $mensagem);
            }
            
        } catch (Exception $e) {
            $this->erro('Erro ao testar conexão: ' . $e->getMessage());
        }
    }
    
    // ========== FUNÇÕES DE REGISTRO LOCAL ==========
    
    public function registrarChamada() {
        try {
            $input = file_get_contents('php://input');
            $dados = json_decode($input, true);
            
            if (!$dados) {
                $this->erro('Dados inválidos');
            }
            
            $numero_destino = $dados['numero_destino'] ?? '';
            $duracao = $dados['duracao'] ?? 0;
            $status = $dados['status'] ?? 'realizada';
            
            if (empty($numero_destino)) {
                $this->erro('Número de destino é obrigatório');
            }
            
            $bina = $this->buscarBinaUsuario();
            $custo = number_format(($duracao / 60) * 0.10, 4, '.', '');
            
            $stmt = $this->conn->prepare("
                INSERT INTO chamadas_telefonicas 
                (tenant_id, usuario_id, numero_origem, numero_destino, duracao, status, custo, data_hora_inicio)
                VALUES (?, ?, ?, ?, ?, ?, ?, NOW())
            ");
            
            $stmt->bind_param("iissids", 
                $this->tenant_id,
                $this->usuario_id,
                $bina,
                $numero_destino,
                $duracao,
                $status,
                $custo
            );
            
            if (!$stmt->execute()) {
                $this->erro('Erro ao inserir chamada: ' . $stmt->error);
            }
            
            $chamada_id = $stmt->insert_id;
            $stmt->close();
            
            $this->atualizarSaldo($custo, $chamada_id);
            
            $this->sucesso([
                'message' => 'Chamada registrada com sucesso',
                'chamada_id' => $chamada_id,
                'custo' => floatval($custo)
            ]);
            
        } catch (Exception $e) {
            $this->erro('Erro ao registrar chamada: ' . $e->getMessage());
        }
    }
    
    public function getSaldo() {
        try {
            $saldo = $this->buscarSaldo();
            
            $this->sucesso([
                'saldo' => number_format($saldo, 2, ',', '.'),
                'saldo_raw' => $saldo
            ]);
            
        } catch (Exception $e) {
            $this->erro('Erro ao buscar saldo: ' . $e->getMessage());
        }
    }
    
    // ========== FUNÇÕES AUXILIARES ==========
    
    private function buscarBinaUsuario() {
        $stmt = $this->conn->prepare("SELECT telefone FROM usuarios WHERE id = ?");
        $stmt->bind_param("i", $this->usuario_id);
        $stmt->execute();
        $result = $stmt->get_result();
        $row = $result->fetch_assoc();
        $stmt->close();
        
        return $row['telefone'] ?? '+5548998298300';
    }
    
    private function buscarNomeUsuario() {
        $stmt = $this->conn->prepare("SELECT nome FROM usuarios WHERE id = ?");
        $stmt->bind_param("i", $this->usuario_id);
        $stmt->execute();
        $result = $stmt->get_result();
        $row = $result->fetch_assoc();
        $stmt->close();
        
        return $row['nome'] ?? 'Usuário';
    }
    
    private function buscarEmailUsuario() {
        $stmt = $this->conn->prepare("SELECT email FROM usuarios WHERE id = ?");
        $stmt->bind_param("i", $this->usuario_id);
        $stmt->execute();
        $result = $stmt->get_result();
        $row = $result->fetch_assoc();
        $stmt->close();
        
        return $row['email'] ?? '';
    }
    
    private function buscarSaldo() {
        $stmt = $this->conn->prepare("SELECT saldo_atual FROM creditos_tenant WHERE tenant_id = ?");
        $stmt->bind_param("i", $this->tenant_id);
        $stmt->execute();
        $result = $stmt->get_result();
        $row = $result->fetch_assoc();
        $stmt->close();
        
        return $row['saldo_atual'] ?? 0;
    }
    
    private function atualizarSaldo($valor, $chamada_id) {
        $stmt = $this->conn->prepare("UPDATE creditos_tenant SET saldo_atual = saldo_atual - ? WHERE tenant_id = ?");
        $stmt->bind_param("di", $valor, $this->tenant_id);
        $stmt->execute();
        $stmt->close();
    }
}

// ========== ROTEAMENTO ==========

try {
    $api = new WebphoneAPI($conn);
    $acao = $_GET['acao'] ?? '';
    
    switch ($acao) {
        // Configurações do webphone
        case 'config':
            $api->getWebphoneConfig();
            break;
            
        case 'webphone-url':
            $api->getWebphoneUrl();
            break;
            
        // Funções da Zenvia para relatórios
        case 'historico-zenvia':
            $api->getHistoricoZenvia();
            break;
            
        case 'estatisticas-zenvia':
            $api->getEstatisticasZenvia();
            break;
            
        case 'testar-zenvia':
            $api->testarConexaoZenvia();
            break;
            
        // Fallback local
        case 'historico-local':
            $api->getHistoricoLocal();
            break;
            
        // Funções de registro
        case 'registrar-chamada':
            $api->registrarChamada();
            break;
            
        case 'saldo':
            $api->getSaldo();
            break;
            
        default:
            http_response_code(404);
            echo json_encode(['success' => false, 'error' => 'Ação não encontrada: ' . $acao]);
    }
    
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'error' => 'Erro interno: ' . $e->getMessage()]);
}
?>