<?php
session_start();
require_once '../includes/db.php';

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

if (!isset($_SESSION['user_id'])) {
    echo json_encode(['status' => false, 'msg' => 'Não autorizado.']);
    exit;
}

$action = $_POST['action'] ?? $_GET['action'] ?? '';
$my_id = $_SESSION['user_id'];
$my_role = $_SESSION['role'];

// --- FUNÇÕES AUXILIARES ---
function getCredits($pdo, $user_id) {
    $stmt = $pdo->prepare("SELECT credits FROM revendedores WHERE id = ?");
    $stmt->execute([$user_id]);
    return (int)$stmt->fetchColumn();
}
function deductCredits($pdo, $user_id, $amount) {
    $pdo->prepare("UPDATE revendedores SET credits = credits - ? WHERE id = ?")->execute([$amount, $user_id]);
}
function deleteResellerTree($pdo, $id) {
    // Apaga filhos recursivamente
    try {
        $stmt = $pdo->prepare("SELECT id FROM revendedores WHERE parent_id = ?");
        $stmt->execute([$id]);
        foreach ($stmt->fetchAll(PDO::FETCH_COLUMN) as $sub) { deleteResellerTree($pdo, $sub); }
    } catch(Exception $e){}
    $pdo->prepare("DELETE FROM users WHERE revendedor_id = ?")->execute([$id]);
    $pdo->prepare("DELETE FROM revendedores WHERE id = ?")->execute([$id]);
}

// ================== AÇÕES DE CLIENTES (USERS) ==================

if ($action == 'create_client') {
    $u = trim($_POST['username']); $p = trim($_POST['password']); $d = (int)$_POST['duration']; $t = (int)$_POST['is_trial'];
    $cost = ($t == 1) ? 0 : $d;
    
    if ($my_role !== 'admin') {
        $cur = getCredits($pdo, $my_id);
        if ($t == 1 && $cur < 1) { echo json_encode(['status'=>false, 'msg'=>'Precisa de 1 crédito para teste.']); exit; }
        if ($t == 0 && $cur < $cost) { echo json_encode(['status'=>false, 'msg'=>'Sem saldo.']); exit; }
    }

    $exp = ($t) ? date('Y-m-d H:i:s', strtotime("+4 hours")) : date('Y-m-d H:i:s', strtotime("+$d months"));
    $owner = ($my_role === 'admin') ? 0 : $my_id;

    try {
        $pdo->prepare("INSERT INTO users (username, password, expire_date, active, is_trial, revendedor_id) VALUES (?, ?, ?, 1, ?, ?)")->execute([$u, $p, $exp, $t, $owner]);
        if ($my_role !== 'admin' && $cost > 0) deductCredits($pdo, $my_id, $cost);
        echo json_encode(['status'=>true, 'msg'=>'Criado!']);
    } catch (Exception $e) { echo json_encode(['status'=>false, 'msg'=>'Erro: Usuário existe?']); }
}

if ($action == 'renew_client') {
    $id = $_POST['id']; $cost = 1;
    if ($my_role !== 'admin') {
        $chk = $pdo->prepare("SELECT id FROM users WHERE id=? AND revendedor_id=?"); $chk->execute([$id, $my_id]);
        if(!$chk->fetch()) { echo json_encode(['status'=>false,'msg'=>'Não é seu cliente.']); exit; }
        if(getCredits($pdo, $my_id) < $cost) { echo json_encode(['status'=>false,'msg'=>'Sem saldo.']); exit; }
    }
    try {
        $curr = $pdo->prepare("SELECT expire_date FROM users WHERE id=?"); $curr->execute([$id]); $expStr = $curr->fetchColumn();
        $now = new DateTime(); $expDate = new DateTime($expStr);
        $newExp = ($expDate < $now) ? $now->modify('+1 month') : $expDate->modify('+1 month');
        $pdo->prepare("UPDATE users SET expire_date=?, active=1, is_trial=0 WHERE id=?")->execute([$newExp->format('Y-m-d H:i:s'), $id]);
        if ($my_role !== 'admin') deductCredits($pdo, $my_id, $cost);
        echo json_encode(['status'=>true, 'msg'=>'Renovado!']);
    } catch(Exception $e) { echo json_encode(['status'=>false, 'msg'=>'Erro renovação.']); }
}

if ($action == 'create_test') {
    if ($my_role !== 'admin' && getCredits($pdo, $my_id) < 1) { echo json_encode(['status'=>false, 'msg'=>'Mínimo 1 crédito.']); exit; }
    $u = !empty($_POST['custom_user']) ? trim($_POST['custom_user']) : "teste".rand(10000,99999);
    $p = !empty($_POST['custom_pass']) ? trim($_POST['custom_pass']) : rand(1000,9999);
    $exp = date('Y-m-d H:i:s', strtotime("+4 hours"));
    $owner = ($my_role === 'admin') ? 0 : $my_id;
    try {
        $pdo->prepare("INSERT INTO users (username, password, expire_date, active, is_trial, revendedor_id) VALUES (?, ?, ?, 1, 1, ?)")->execute([$u, $p, $exp, $owner]);
        echo json_encode(['status'=>true, 'username'=>$u, 'msg'=>'Teste criado!']);
    } catch(Exception $e) { echo json_encode(['status'=>false, 'msg'=>'Erro: Login em uso.']); }
}

if ($action == 'edit_client') {
    $id = $_POST['id']; $p = $_POST['password']; $e = $_POST['expire_date']; $a = (int)$_POST['active']; $n = $_POST['notes']; $b = isset($_POST['bouquets']) ? implode(',',$_POST['bouquets']) : '';
    if ($my_role !== 'admin') {
        $chk = $pdo->prepare("SELECT id FROM users WHERE id=? AND revendedor_id=?"); $chk->execute([$id, $my_id]);
        if(!$chk->fetch()) exit;
    }
    $pdo->prepare("UPDATE users SET password=?, expire_date=?, active=?, notes=?, bouquets=? WHERE id=?")->execute([$p, date('Y-m-d H:i:s', strtotime($e)), $a, $n, $b, $id]);
    echo json_encode(['status'=>true, 'msg'=>'Salvo!']);
}

if ($action == 'delete_client') {
    $id = $_POST['id'];
    if ($my_role !== 'admin') {
        $chk = $pdo->prepare("SELECT id FROM users WHERE id=? AND revendedor_id=?"); $chk->execute([$id, $my_id]);
        if(!$chk->fetch()) exit;
    }
    $pdo->prepare("DELETE FROM users WHERE id=?")->execute([$id]);
    echo json_encode(['status'=>true, 'msg'=>'Deletado.']);
}

if ($action == 'get_client') {
    $id = $_GET['id'];
    $sql = "SELECT * FROM users WHERE id=?";
    $arr = [$id];
    if($my_role !== 'admin') { $sql .= " AND revendedor_id=?"; $arr[] = $my_id; }
    $stmt = $pdo->prepare($sql); $stmt->execute($arr); $u = $stmt->fetch(PDO::FETCH_ASSOC);
    if($u) { $u['expire_date_fmt'] = date('Y-m-d\TH:i', strtotime($u['expire_date'])); $u['expire_view'] = date('d/m/Y H:i', strtotime($u['expire_date'])); echo json_encode(['status'=>true, 'data'=>$u]); }
    else echo json_encode(['status'=>false]);
}

if ($action == 'toggle_status') {
    $id = $_POST['id']; $new = ($_POST['status'] == 1) ? 0 : 1;
    if ($my_role !== 'admin') {
        $chk = $pdo->prepare("SELECT id FROM users WHERE id=? AND revendedor_id=?"); $chk->execute([$id, $my_id]);
        if(!$chk->fetch()) exit;
    }
    $pdo->prepare("UPDATE users SET active=? WHERE id=?")->execute([$new, $id]);
    echo json_encode(['status'=>true, 'msg'=>'Alterado.']);
}

// ================== AÇÕES DE REVENDA (SUB-REVENDEDORES) ==================

if ($action == 'create_reseller') {
    // AGORA PERMITE REVENDA CRIAR
    $u = $_POST['username']; $p = $_POST['password']; $m = $_POST['email']; $c = (int)$_POST['credits'];
    
    // Define quem é o Pai (Parent ID)
    $parent = ($my_role === 'admin') ? 0 : $my_id;

    // Se for revendedor criando sub, verifica se tem crédito para transferir (OPCIONAL - Aqui só cria com 0 ou o que digitou)
    // Normalmente criação é grátis, só transferência gasta. Deixarei passar.

    try {
        // Tenta inserir com parent_id. Se tabela não tiver parent_id, vai dar erro no SQL e cair no catch.
        $sql = "INSERT INTO revendedores (username, password, email, credits, active, parent_id) VALUES (?, ?, ?, ?, 1, ?)";
        $pdo->prepare($sql)->execute([$u, $p, $m, $c, $parent]);
        echo json_encode(['status'=>true, 'msg'=>'Sub-Revenda criada!']);
    } catch (Exception $e) {
        // Fallback se não tiver parent_id ou user duplicado
        echo json_encode(['status'=>false, 'msg'=>'Erro: Login já existe?']);
    }
}

if ($action == 'delete_reseller') {
    $id = $_POST['id'];
    
    // Segurança: Admin deleta qualquer um. Revenda só deleta seus filhos.
    if ($my_role !== 'admin') {
        try {
            $chk = $pdo->prepare("SELECT id FROM revendedores WHERE id=? AND parent_id=?"); 
            $chk->execute([$id, $my_id]);
            if(!$chk->fetch()) { echo json_encode(['status'=>false, 'msg'=>'Não é sua sub-revenda.']); exit; }
        } catch(Exception $e) { echo json_encode(['status'=>false]); exit; }
    }

    try {
        deleteResellerTree($pdo, $id);
        echo json_encode(['status'=>true, 'msg'=>'Excluído com sucesso.']);
    } catch(Exception $e) { echo json_encode(['status'=>false, 'msg'=>'Erro ao excluir.']); }
}

if ($action == 'edit_reseller') {
    $id = $_POST['id']; $p = $_POST['password']; $m = $_POST['email']; $c = (int)$_POST['credits']; $a = (int)$_POST['active'];
    
    if ($my_role !== 'admin') {
        $chk = $pdo->prepare("SELECT id FROM revendedores WHERE id=? AND parent_id=?"); $chk->execute([$id, $my_id]);
        if(!$chk->fetch()) exit;
    }
    $pdo->prepare("UPDATE revendedores SET password=?, email=?, credits=?, active=? WHERE id=?")->execute([$p, $m, $c, $a, $id]);
    echo json_encode(['status'=>true, 'msg'=>'Atualizado!']);
}

if ($action == 'get_reseller') {
    $id = $_GET['id'];
    $sql = "SELECT * FROM revendedores WHERE id=?";
    $arr = [$id];
    if ($my_role !== 'admin') { $sql .= " AND parent_id=?"; $arr[] = $my_id; }
    
    $stmt = $pdo->prepare($sql); $stmt->execute($arr);
    $d = $stmt->fetch(PDO::FETCH_ASSOC);
    if($d) echo json_encode(['status'=>true, 'data'=>$d]);
    else echo json_encode(['status'=>false]);
}

if ($action == 'toggle_reseller_status') {
    $id = $_POST['id']; $new = ($_POST['status'] == 1) ? 0 : 1;
    if ($my_role !== 'admin') {
        $chk = $pdo->prepare("SELECT id FROM revendedores WHERE id=? AND parent_id=?"); $chk->execute([$id, $my_id]);
        if(!$chk->fetch()) exit;
    }
    $pdo->prepare("UPDATE revendedores SET active=? WHERE id=?")->execute([$new, $id]);
    echo json_encode(['status'=>true, 'msg'=>'Status alterado.']);
}
?>