<?php
// api/clients_api.php - Corrigido: Desconto de Créditos (Criar/Renovar)
header('Content-Type: application/json');
session_start();
require_once '../includes/db.php';

if (!isset($_SESSION['logged_in_fxtream'])) { 
    die(json_encode(['status'=>false, 'msg'=>'Acesso negado'])); 
}

$action = $_POST['action'] ?? $_GET['action'] ?? '';
$admin_id = $_SESSION['user_id'];

// Configurações Globais
$server_url = "http://".$_SERVER['HTTP_HOST'];
$confianca_dias = 3; 

try {
    $c = $pdo->query("SELECT dominio_url, confianca_dias FROM configuracoes LIMIT 1")->fetch(PDO::FETCH_ASSOC);
    if($c && !empty($c['dominio_url'])) {
        $server_url = rtrim(trim($c['dominio_url']), "/");
        if (!preg_match("~^(?:f|ht)tps?://~i", $server_url)) $server_url = "http://" . $server_url;
    }
    if(isset($c['confianca_dias'])) $confianca_dias = intval($c['confianca_dias']);
} catch(Exception $e){}

switch($action) {

    // === SALVAR NOVO (CRIAR) ===
    case 'save':
        $user = trim($_POST['username']);
        $pass = trim($_POST['password']);
        $duration = intval($_POST['duration']);
        $is_trial = intval($_POST['is_trial']); // 1 = Teste, 0 = Oficial
        $notes = $_POST['notes'] ?? '';
        $max_conn = intval($_POST['max_connections'] ?? 1);
        
        $bouquets = isset($_POST['bouquets']) ? json_encode($_POST['bouquets']) : '[]';

        if(empty($user) || empty($pass)) { echo json_encode(['status'=>false, 'msg'=>'Preencha todos os campos']); exit; }

        // Verifica duplicidade
        $chk = $pdo->prepare("SELECT id FROM users WHERE username = ?");
        $chk->execute([$user]);
        if($chk->rowCount() > 0){ echo json_encode(['status'=>false, 'msg'=>'Usuário já existe']); exit; }

        // === VERIFICAÇÃO DE CRÉDITOS (Apenas se não for teste e não for Admin ID 1) ===
        if ($is_trial == 0 && $admin_id != 1) {
            $stmtCred = $pdo->prepare("SELECT credits FROM revendedores WHERE id = ?");
            $stmtCred->execute([$admin_id]);
            $my_credits = $stmtCred->fetchColumn();

            if ($my_credits < 1) {
                echo json_encode(['status'=>false, 'msg'=>'Saldo insuficiente para criar conta oficial!']);
                exit;
            }
        }
        // ==============================================================================

        if($is_trial == 1) {
            $exp = date('Y-m-d H:i:s', strtotime("+$duration hours"));
        } else {
            $exp = date('Y-m-d H:i:s', strtotime("+$duration months"));
        }

        $sql = "INSERT INTO users (username, password, revendedor_id, expire_date, active, is_trial, notes, bouquets, max_connections) 
                VALUES (?, ?, ?, ?, 1, ?, ?, ?, ?)";
        $stmt = $pdo->prepare($sql);
        
        if($stmt->execute([$user, $pass, $admin_id, $exp, $is_trial, $notes, $bouquets, $max_conn])) {
            
            // === DESCONTA O CRÉDITO (Se não for teste e não for Admin) ===
            if ($is_trial == 0 && $admin_id != 1) {
                $pdo->prepare("UPDATE revendedores SET credits = credits - 1 WHERE id = ?")->execute([$admin_id]);
            }
            // ==========================================================

            echo json_encode([
                'status' => true, 
                'msg' => ($is_trial ? 'Teste gerado!' : 'Cliente criado com sucesso!'),
                'data' => [
                    'username' => $user,
                    'password' => $pass,
                    'expire_view' => date('d/m/Y H:i', strtotime($exp)),
                    'server_url' => $server_url
                ]
            ]);
        } else {
            echo json_encode(['status'=>false, 'msg'=>'Erro ao gravar no banco']);
        }
    break;

    // === ATUALIZAR (EDITAR DADOS) ===
    case 'update':
        $id = $_POST['id'];
        $pass = trim($_POST['password']);
        $notes = $_POST['notes'] ?? '';
        $max_conn = intval($_POST['max_connections'] ?? 1);
        $bouquets = isset($_POST['bouquets']) ? json_encode($_POST['bouquets']) : '[]';

        if(empty($id) || empty($pass)) { echo json_encode(['status'=>false, 'msg'=>'Dados inválidos']); exit; }

        $sql = "UPDATE users SET password = ?, notes = ?, max_connections = ?, bouquets = ? WHERE id = ?";
        $stmt = $pdo->prepare($sql);

        if($stmt->execute([$pass, $notes, $max_conn, $bouquets, $id])) {
            echo json_encode(['status'=>true, 'msg'=>'Dados atualizados com sucesso!']);
        } else {
            echo json_encode(['status'=>false, 'msg'=>'Erro ao atualizar']);
        }
    break;

    // === RENOVAÇÃO NORMAL (COBRA CRÉDITO E TIRA O TESTE) ===
    case 'renew':
        $id = $_POST['id'];
        $months = intval($_POST['months']); // Quantidade de meses a renovar
        if($months < 1) $months = 1;

        // Pega dados do usuário
        $stmt = $pdo->prepare("SELECT username, password, expire_date FROM users WHERE id = ?");
        $stmt->execute([$id]);
        $u = $stmt->fetch(PDO::FETCH_ASSOC);

        if(!$u) { echo json_encode(['status'=>false, 'msg'=>'Cliente não encontrado']); exit; }

        // === VERIFICAÇÃO DE CRÉDITOS (Custo = Quantidade de Meses) ===
        if ($admin_id != 1) {
            $stmtCred = $pdo->prepare("SELECT credits FROM revendedores WHERE id = ?");
            $stmtCred->execute([$admin_id]);
            $my_credits = $stmtCred->fetchColumn();

            if ($my_credits < $months) {
                echo json_encode(['status'=>false, 'msg'=>"Saldo insuficiente! Você precisa de $months crédito(s)."]);
                exit;
            }
        }
        // =============================================================

        // Calcula data
        $base = (strtotime($u['expire_date']) > time()) ? $u['expire_date'] : date('Y-m-d H:i:s');
        $new_exp = date('Y-m-d H:i:s', strtotime("$base +$months months"));

        // Atualiza usuário: Data nova, Ativo, e NÃO É MAIS TESTE (is_trial = 0)
        $up = $pdo->prepare("UPDATE users SET expire_date = ?, active = 1, is_trial = 0 WHERE id = ?");
        
        if($up->execute([$new_exp, $id])) {
            
            // === DESCONTA OS CRÉDITOS ===
            if ($admin_id != 1) {
                $pdo->prepare("UPDATE revendedores SET credits = credits - ? WHERE id = ?")->execute([$months, $admin_id]);
            }
            // ============================

            echo json_encode([
                'status' => true, 
                'msg' => 'Renovado com sucesso! Créditos descontados.',
                'data' => [
                    'username' => $u['username'],
                    'password' => $u['password'],
                    'expire_view' => date('d/m/Y', strtotime($new_exp))
                ]
            ]);
        }
    break;

    // === RENOVAÇÃO CONFIANÇA (NÃO COBRA CRÉDITO, MAS TIRA O TESTE) ===
    case 'renew_confianca':
        $id = $_POST['id'];
        
        $stmt = $pdo->prepare("SELECT username, password, expire_date, last_confianca FROM users WHERE id = ?");
        $stmt->execute([$id]);
        $u = $stmt->fetch(PDO::FETCH_ASSOC);

        if(!$u) { echo json_encode(['status'=>false, 'msg'=>'Cliente não encontrado']); exit; }

        // Validação Mês
        if (!empty($u['last_confianca']) && $u['last_confianca'] != '0000-00-00 00:00:00') {
            $last_month = date('Y-m', strtotime($u['last_confianca']));
            $current_month = date('Y-m');
            
            if ($last_month === $current_month) {
                echo json_encode(['status'=>false, 'msg'=>'Erro: Cliente já usou confiança este mês!']);
                exit;
            }
        }

        $base = (strtotime($u['expire_date']) > time()) ? $u['expire_date'] : date('Y-m-d H:i:s');
        $new_exp = date('Y-m-d H:i:s', strtotime("$base +$confianca_dias days"));

        // Atualiza: is_trial = 0 (Confiança torna o cliente ativo temporariamente)
        $up = $pdo->prepare("UPDATE users SET expire_date = ?, active = 1, is_trial = 0, last_confianca = NOW() WHERE id = ?");
        
        if($up->execute([$new_exp, $id])) {
            echo json_encode([
                'status' => true, 
                'msg' => "Confiança ($confianca_dias dias) aplicada!",
                'data' => [
                    'username' => $u['username'],
                    'password' => $u['password'],
                    'expire_view' => date('d/m/Y', strtotime($new_exp))
                ]
            ]);
        } else {
             echo json_encode(['status'=>false, 'msg'=>'Erro ao aplicar confiança']);
        }
    break;

    // === PEGAR CLIENTE ===
    case 'get_client':
        $id = $_GET['id'];
        $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
        $stmt->execute([$id]);
        $u = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if($u) {
            echo json_encode([
                'status'=>true, 
                'data'=>[
                    'id'=>$u['id'],
                    'username'=>$u['username'], 
                    'password'=>$u['password'], 
                    'notes'=>$u['notes'],
                    'max_connections'=>$u['max_connections'],
                    'is_trial'=>$u['is_trial'],
                    'bouquets'=>$u['bouquets'],
                    'expire_view'=>date('d/m/Y H:i', strtotime($u['expire_date'])),
                    'server_url' => $server_url
                ]
            ]);
        } else {
            echo json_encode(['status'=>false, 'msg'=>'Erro']);
        }
    break;

    // === DELETAR ===
    case 'delete':
        $pdo->prepare("DELETE FROM users WHERE id = ?")->execute([$_POST['id']]);
        echo json_encode(['status'=>true]);
    break;

    // === TOGGLE BLOCK ===
    case 'toggle_block':
        $pdo->prepare("UPDATE users SET active = ? WHERE id = ?")->execute([$_POST['active'], $_POST['id']]);
        echo json_encode(['status'=>true, 'msg'=>'Status alterado']);
    break;
}
?>