<?php
// /telefonia/api/webphone_api.php
session_start();

// CORREÇÃO: Sobe um nível para encontrar o conexao.php
require_once dirname(__DIR__) . '/conexao.php';

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

class WebphoneAPI {
    private $conn;
    private $tenant_id;
    private $usuario_id;
    
    public function __construct($conn) {
        $this->conn = $conn;
        $this->autenticar();
    }
    
    private function autenticar() {
        if (!isset($_SESSION['usuario_id']) || !isset($_SESSION['tenant_id'])) {
            $this->erro('Não autenticado', 401);
        }
        
        $this->usuario_id = (int)$_SESSION['usuario_id'];
        $this->tenant_id = (int)$_SESSION['tenant_id'];
    }
    
    private function erro($msg, $code = 400) {
        http_response_code($code);
        echo json_encode(['success' => false, 'error' => $msg]);
        exit;
    }
    
    private function sucesso($data = []) {
        echo json_encode(array_merge(['success' => true], $data));
        exit;
    }
    
    public function getConfig() {
        try {
            // Buscar configuração do webphone
            $stmt = $this->conn->prepare("
                SELECT cw.*, u.nome, u.email, u.telefone, 
                       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 se não existir
                $bina = $this->buscarTelefoneUsuario();
                $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' => 'R$ ' . number_format($config['saldo_atual'] ?? 0, 2, ',', '.'),
                    'saldo_raw' => floatval($config['saldo_atual'] ?? 0),
                    'webphone_key' => $config['webphone_key'],
                    'tenant_id' => $this->tenant_id,
                    'usuario_id' => $this->usuario_id
                ]
            ]);
            
        } catch (Exception $e) {
            $this->erro('Erro ao carregar configurações: ' . $e->getMessage());
        }
    }
    
    public function registrarChamada() {
        try {
            $input = json_decode(file_get_contents('php://input'), true);
            
            if (!$input) {
                $this->erro('Dados inválidos');
            }
            
            $numero_destino = $input['numero_destino'] ?? '';
            $duracao = intval($input['duracao'] ?? 0);
            $status = $input['status'] ?? 'realizada';
            $call_id = $input['call_id'] ?? uniqid('call_', true);
            
            if (empty($numero_destino)) {
                $this->erro('Número de destino é obrigatório');
            }
            
            // Validar status contra o ENUM do banco
            $status_validos = ['realizada', 'nao_atendida', 'ocupado', 'falhada', 'iniciada'];
            if (!in_array($status, $status_validos)) {
                $status = 'realizada';
            }
            
            $bina = $this->buscarTelefoneUsuario();
            
            // Calcular custo (R$ 0,10 por minuto)
            $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, call_id_zenvia, custo, data_hora_inicio)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW())
            ");
            
            $stmt->bind_param("iississd", 
                $this->tenant_id, 
                $this->usuario_id, 
                $bina, 
                $numero_destino,
                $duracao, 
                $status, 
                $call_id, 
                $custo
            );
            
            if ($stmt->execute()) {
                $chamada_id = $stmt->insert_id;
                
                // Atualizar data_hora_fim se a chamada foi concluída
                if ($duracao > 0 && $status != 'iniciada') {
                    $update = $this->conn->prepare("
                        UPDATE chamadas_telefonicas 
                        SET data_hora_fim = DATE_ADD(data_hora_inicio, INTERVAL ? SECOND) 
                        WHERE id = ?
                    ");
                    $update->bind_param("ii", $duracao, $chamada_id);
                    $update->execute();
                    $update->close();
                }
                
                // Atualizar saldo apenas se não for início de chamada
                if ($status != 'iniciada' && $custo > 0) {
                    $this->atualizarSaldo($custo);
                }
                
                $this->sucesso([
                    'chamada_id' => $chamada_id,
                    'custo' => floatval($custo)
                ]);
            } else {
                $this->erro('Erro ao inserir chamada: ' . $this->conn->error);
            }
            
        } catch (Exception $e) {
            $this->erro('Erro ao registrar chamada: ' . $e->getMessage());
        }
    }
    
    public function getHistorico() {
        try {
            $limite = isset($_GET['limite']) ? intval($_GET['limite']) : 20;
            $limite = min($limite, 100);
            
            $stmt = $this->conn->prepare("
                SELECT id, numero_origem, numero_destino, duracao, status, 
                       custo, data_hora_inicio, data_hora_fim
                FROM chamadas_telefonicas 
                WHERE tenant_id = ? 
                ORDER BY data_hora_inicio DESC 
                LIMIT ?
            ");
            $stmt->bind_param("ii", $this->tenant_id, $limite);
            $stmt->execute();
            $result = $stmt->get_result();
            
            $chamadas = [];
            while ($row = $result->fetch_assoc()) {
                $chamadas[] = [
                    'id' => (int)$row['id'],
                    'numero_origem' => $row['numero_origem'],
                    'numero_destino' => $row['numero_destino'],
                    'duracao' => (int)$row['duracao'],
                    'status' => $row['status'],
                    'custo' => floatval($row['custo']),
                    'data_hora_inicio' => $row['data_hora_inicio'],
                    'data_hora_fim' => $row['data_hora_fim']
                ];
            }
            
            $this->sucesso([
                'chamadas' => $chamadas,
                'total' => count($chamadas)
            ]);
            
        } catch (Exception $e) {
            $this->erro('Erro ao carregar histórico: ' . $e->getMessage());
        }
    }
    
    public function getSaldo() {
        try {
            $saldo = $this->buscarSaldo();
            
            $this->sucesso([
                'saldo' => 'R$ ' . number_format($saldo, 2, ',', '.'),
                'saldo_raw' => $saldo
            ]);
            
        } catch (Exception $e) {
            $this->erro('Erro ao buscar saldo: ' . $e->getMessage());
        }
    }
    
    // ========== FUNÇÕES AUXILIARES ==========
    
    private function buscarTelefoneUsuario() {
        $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) {
        $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) {
        case 'config':
            $api->getConfig();
            break;
        case 'registrar':
            $api->registrarChamada();
            break;
        case 'historico':
            $api->getHistorico();
            break;
        case 'saldo':
            $api->getSaldo();
            break;
        default:
            http_response_code(404);
            echo json_encode(['success' => false, 'error' => 'Ação inválida: ' . $acao]);
    }
    
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'error' => 'Erro interno: ' . $e->getMessage()]);
}
?>