<?php
// 个人中心（登录 + 账号设置 + 分销 + 提现 + 上传）
require_once __DIR__ . '/../includes/bootstrap.php';

$userId = current_user_id();
$action = $_GET['action'] ?? '';
$tab = $_GET['tab'] ?? 'home';
$me = current_user_record();

// 账号密码登录
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['op'] ?? '') === 'login') {
    csrf_check();
    $username = trim($_POST['username'] ?? '');
    $password = $_POST['password'] ?? '';
    if ($username === '' || $password === '') {
        flash('err', '请输入账号和密码');
    } else {
        $u = user_login_by_account($username, $password);
        if ($u) {
            flash('ok', '登录成功');
            redirect('login.php');
        } else {
            flash('err', '账号或密码错误');
        }
    }
    redirect('login.php?tab=login');
}

// 退出登录
if (isset($_GET['logout'])) {
    setcookie('user_token', '', time() - 3600, '/');
    flash('ok', '已退出登录');
    redirect('login.php');
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    csrf_check();
    $op = $_POST['op'] ?? '';

    if ($op === 'save_nick') {
        $nick = trim($_POST['nickname'] ?? '');
        if ($nick !== '') {
            db()->prepare('UPDATE user SET nickname=? WHERE id=?')->execute([$nick, $userId]);
            flash('ok', '昵称已保存');
        }
        redirect('login.php');
    } elseif ($op === 'set_account') {
        $username = trim($_POST['username'] ?? '');
        $password = $_POST['password'] ?? '';
        if (strlen($username) < 3 || strlen($username) > 20) { flash('err', '账号长度需在 3-20 位之间'); redirect('login.php?tab=account'); }
        if (strlen($password) < 6) { flash('err', '密码至少 6 位'); redirect('login.php?tab=account'); }
        if (!preg_match('/^[A-Za-z0-9_]+$/', $username)) { flash('err', '账号只能包含字母、数字、下划线'); redirect('login.php?tab=account'); }
        $stmt = db()->prepare('SELECT id FROM user WHERE username = ? AND id <> ?');
        $stmt->execute([$username, $userId]);
        if ($stmt->fetch()) { flash('err', '账号已被占用'); redirect('login.php?tab=account'); }
        user_set_account($userId, $username, $password);
        flash('ok', '账号已设置');
        redirect('login.php?tab=account');
    } elseif ($op === 'change_password') {
        $old = $_POST['old_password'] ?? '';
        $new = $_POST['new_password'] ?? '';
        $err = user_change_password($userId, $old, $new);
        if ($err) { flash('err', $err); } else { flash('ok', '密码已修改'); }
        redirect('login.php?tab=account');
    } elseif ($op === 'apply_agent') {
        if ((int)$me['agent_status'] === 0) {
            db()->prepare('UPDATE user SET agent_status=1, agent_apply_at=? WHERE id=?')
                ->execute([time(), $userId]);
            flash('ok', '申请已提交，请等待审核');
        } else {
            flash('err', '您已提交过申请');
        }
        redirect('login.php?tab=agent');
    } elseif ($op === 'apply_withdraw') {
        $amount = (float)($_POST['amount'] ?? 0);
        $payType = $_POST['pay_type'] ?? 'wechat';
        $account = trim($_POST['account'] ?? '');
        $realName = trim($_POST['real_name'] ?? '');
        $minW = (float)config_get('withdraw_min', '10');

        if ((int)$me['agent_status'] !== 2) { flash('err', '仅代理可申请提现'); redirect('login.php?tab=agent'); }
        // 优先用后台手动设置的 agent_avail，没有则用公式计算
        $avail = isset($me['agent_avail']) && $me['agent_avail'] !== null && $me['agent_avail'] !== ''
            ? (float)$me['agent_avail']
            : max(0, (float)$me['agent_commission'] - (float)$me['agent_withdrawn']);
        if ($amount <= 0) { flash('err', '请填写有效金额'); redirect('login.php?tab=agent'); }
        if ($amount < $minW) { flash('err', '提现金额最低 ' . $minW . ' 元'); redirect('login.php?tab=agent'); }
        if ($amount > $avail) { flash('err', '可提现余额不足'); redirect('login.php?tab=agent'); }
        if (!in_array($payType, ['wechat','alipay'], true)) { flash('err', '请选择收款方式'); redirect('login.php?tab=agent'); }

        $qrPath = '';
        $qrErr = null;
        if (!empty($_FILES['qr_image']['name'])) {
            [$qrPath, $qrErr] = handle_upload('qr_image', 'qrcode', allowed_image_ext(), cover_max_size());
        }
        if ($qrErr || !$qrPath) { flash('err', '请上传微信/支付宝收款二维码'); redirect('login.php?tab=agent'); }

        // 检查是否已有「待审核」的提现申请：避免用户同时挂多笔
        $pStmt = db()->prepare('SELECT COUNT(*) AS c FROM agent_withdraw WHERE user_id=? AND status=0');
        $pStmt->execute([$userId]);
        $pendingCnt = (int)($pStmt->fetch()['c'] ?? 0);
        if ($pendingCnt > 0) {
            flash('err', '您还有 ' . $pendingCnt . ' 笔提现申请待审核，请等待处理后再提交');
            redirect('login.php?tab=agent');
        }

        // 事务：插入申请 + 立即冻结金额
        $pdo = db();
        $pdo->beginTransaction();
        try {
            // 1. 写入提现申请
            $pdo->prepare('INSERT INTO agent_withdraw (user_id, amount, pay_type, qr_image, account, real_name, status, created_at) VALUES (?,?,?,?,?,?,0,?)')
                ->execute([$userId, $amount, $payType, $qrPath, $account, $realName, time()]);

            // 2. 立即累加 agent_withdrawn（公式：可提现 = 累计佣金 - 已提现 → 申请后立即减少）
            $pdo->prepare('UPDATE user SET agent_withdrawn = agent_withdrawn + ? WHERE id=?')
                ->execute([$amount, $userId]);

            // 3. 如果后台手动设置过 agent_avail，同步扣减
            $curAvail = isset($me['agent_avail']) && $me['agent_avail'] !== null && $me['agent_avail'] !== ''
                ? (float)$me['agent_avail'] : null;
            if ($curAvail !== null) {
                $newAvail = max(0, $curAvail - $amount);
                $pdo->prepare('UPDATE user SET agent_avail = ? WHERE id=?')
                    ->execute([$newAvail, $userId]);
            }

            $pdo->commit();
        } catch (Exception $e) {
            $pdo->rollBack();
            flash('err', '提交失败：' . $e->getMessage());
            redirect('login.php?tab=agent');
        }
        flash('ok', '提现申请已提交，¥' . number_format($amount, 2) . ' 已冻结');
        redirect('login.php?tab=agent');
    } elseif ($op === 'agent_upload') {
        if ((int)$me['agent_status'] !== 2) { flash('err', '仅代理可上传作品'); redirect('login.php?tab=upload'); }
        $title = trim($_POST['title'] ?? '');
        $desc = trim($_POST['description'] ?? '');
        $likes = trim($_POST['likes'] ?? '0');
        $type = ($_POST['work_type'] ?? 'video') === 'photo' ? 'photo' : 'video';
        if ($title === '') { flash('err', '请填写标题'); redirect('login.php?tab=upload'); }

        $coverPath = '';
        if (!empty($_FILES['cover']['name'])) {
            [$coverPath, $err] = handle_upload('cover', 'covers', allowed_image_ext(), cover_max_size());
            if ($err) { flash('err', '封面上传失败：' . $err); redirect('login.php?tab=upload'); }
        }

        $filePath = '';
        $imagesJson = '';
        if ($type === 'video') {
            if (!$coverPath) { flash('err', '请上传封面图'); redirect('login.php?tab=upload'); }
            if (empty($_FILES['file']['name'])) { flash('err', '请上传视频文件'); redirect('login.php?tab=upload'); }
            [$filePath, $err] = handle_upload('file', 'videos', allowed_video_ext(), upload_max_size());
            if ($err) { flash('err', '视频上传失败：' . $err); redirect('login.php?tab=upload'); }
        } else {
            if (empty($_FILES['photos']['name'][0])) { flash('err', '请至少上传一张照片'); redirect('login.php?tab=upload'); }
            $res = handle_multi_upload('photos', 'photos', allowed_image_ext(), cover_max_size());
            if (!empty($res['err'])) { flash('err', '图片上传失败：' . $res['err']); redirect('login.php?tab=upload'); }
            $imagesJson = json_encode(array_values($res['paths']), JSON_UNESCAPED_UNICODE);
            if (!$coverPath) $coverPath = $res['paths'][0];
            $filePath = $imagesJson;
        }

        video_create([
            'title' => $title, 'description' => $desc, 'cover' => $coverPath, 'file_path' => $filePath,
            'type' => $type, 'images' => $imagesJson,
            'sort' => 0, 'status' => 1, 'likes' => $likes,
            'review_status' => 0, 'uploader_id' => $userId,
        ]);
        flash('ok', '上传成功，等待管理员审核');
        redirect('login.php?tab=upload');
    }
}

$isVip = is_vip($userId);
$me = current_user_record();
$agentStatus = (int)($me['agent_status'] ?? 0);
$agentCode   = $me['agent_code'] ?? '';
// 优先用后台手动设置的 agent_avail，没有则用公式计算（保持和后台管理一致）
$availCommission = isset($me['agent_avail']) && $me['agent_avail'] !== null && $me['agent_avail'] !== ''
    ? (float)$me['agent_avail']
    : max(0, (float)($me['agent_commission'] ?? 0) - (float)($me['agent_withdrawn'] ?? 0));

$withdraws = array();
$myWorks = array();
$stmt = db()->prepare('SELECT * FROM agent_withdraw WHERE user_id = ? ORDER BY id DESC LIMIT 20');
$stmt->execute([$userId]);
$withdraws = $stmt->fetchAll();
$stmt = db()->prepare('SELECT * FROM video WHERE uploader_id = ? ORDER BY id DESC LIMIT 50');
$stmt->execute([$userId]);
$myWorks = $stmt->fetchAll();

$flashes = flash_pop();

// 推广链接
$promoUrl = '';
if ($agentStatus === 2 && $agentCode) {
    $promoUrl = base_url() . 'index.php?ref=' . urlencode($agentCode);
}
?>
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
<title>个人中心</title>
<style>
*{margin:0;padding:0;box-sizing:border-box;font-family:system-ui,-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;}
:root{
    --primary:#ff2c55;--primary2:#ff5b8a;--grad1:linear-gradient(135deg,#ff2c55 0%,#ff5b8a 100%);
    --grad2:linear-gradient(135deg,#fa709a 0%,#ffc6dc 100%);
    --grad3:linear-gradient(135deg,#a18cd1 0%,#fbc2eb 100%);
    --grad4:linear-gradient(135deg,#667eea 0%,#764ba2 100%);
    --grad-vip:linear-gradient(135deg,#ff5b8a 0%,#ff2c55 100%);
    --bg:#f7f8fc;--card:#fff;--text:#1a1a2e;--sub:#888;--border:#f0f0f5;
}
body{background:var(--bg);color:var(--text);min-height:100vh;-webkit-font-smoothing:antialiased;}

.uc-header{
    background:var(--grad1);
    padding:18px 16px 70px;
    position:relative;
    color:#fff;
    overflow:hidden;
}
.uc-header::before{
    content:"";position:absolute;top:-60%;right:-20%;width:300px;height:300px;border-radius:50%;
    background:rgba(255,255,255,.1);
}
.uc-header::after{
    content:"";position:absolute;bottom:-40%;left:-10%;width:200px;height:200px;border-radius:50%;
    background:rgba(255,255,255,.08);
}
.uc-topbar{display:flex;align-items:center;justify-content:space-between;position:relative;z-index:2;}
.uc-topbar .back{color:#fff;font-size:22px;text-decoration:none;width:34px;height:34px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:rgba(255,255,255,.15);}
.uc-topbar h1{font-size:17px;font-weight:600;}
.uc-topbar .logout{color:#fff;font-size:12px;text-decoration:none;padding:6px 12px;border-radius:14px;background:rgba(255,255,255,.18);}
.uc-user{display:flex;align-items:center;gap:14px;margin-top:18px;position:relative;z-index:2;}
.uc-avatar{width:60px;height:60px;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;font-size:26px;color:var(--primary);box-shadow:0 4px 16px rgba(0,0,0,.15);font-weight:700;}
.uc-info .uname{font-size:18px;font-weight:600;display:flex;align-items:center;gap:6px;}
.uc-info .uname .vip{background:var(--grad-vip);color:#fff;padding:1px 6px;border-radius:6px;font-size:10px;}
.uc-info .uid{font-size:12px;opacity:.85;margin-top:2px;}

.uc-stats{
    margin:-50px 14px 14px;
    background:#fff;
    border-radius:16px;
    padding:14px;
    display:grid;
    grid-template-columns:repeat(3,1fr);
    gap:8px;
    box-shadow:0 4px 20px rgba(0,0,0,.06);
    position:relative;
    z-index:3;
}
@keyframes toastIn{from{opacity:0;transform:translate(-50%,-40%) scale(.9);}to{opacity:1;transform:translate(-50%,-50%) scale(1);}}
.uc-stat{text-align:center;padding:6px 0;}
.uc-stat .v{font-size:18px;font-weight:700;color:var(--text);}
.uc-stat .l{font-size:11px;color:var(--sub);margin-top:2px;}
.uc-stat .v.green{color:#16a34a;}.uc-stat .v.red{color:var(--primary);}

.box{max-width:480px;margin:0 auto;padding:0 14px 90px;}
.card{background:var(--card);border-radius:14px;padding:16px;margin-bottom:12px;box-shadow:0 1px 3px rgba(0,0,0,.03);}
.card h2{font-size:15px;margin-bottom:12px;display:flex;align-items:center;gap:8px;font-weight:600;}
.card h2 .ic{width:28px;height:28px;border-radius:8px;background:var(--grad1);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;}

.promo{
    position:relative;
    background:linear-gradient(135deg,#ff5b8a 0%,#fe2c55 50%,#d23b7a 100%);
    border-radius:18px;
    padding:18px;
    margin-bottom:14px;
    color:#fff;
    overflow:hidden;
    box-shadow:0 8px 24px rgba(254,44,85,.25);
}
.promo::before{
    content:"";position:absolute;top:-40%;right:-20%;width:220px;height:220px;border-radius:50%;
    background:radial-gradient(circle,rgba(255,255,255,.18),transparent 70%);
    pointer-events:none;
}
.promo::after{
    content:"";position:absolute;bottom:-50%;left:-15%;width:180px;height:180px;border-radius:50%;
    background:radial-gradient(circle,rgba(255,255,255,.12),transparent 70%);
    pointer-events:none;
}
.promo-head{position:relative;z-index:1;display:flex;align-items:center;justify-content:space-between;margin-bottom:14px;}
.promo-title{font-size:16px;font-weight:700;display:flex;align-items:center;gap:6px;}
.promo-title::before{content:"💎";font-size:18px;}
.promo-rate{
    background:rgba(255,255,255,.25);backdrop-filter:blur(10px);
    color:#fff;font-size:12px;padding:4px 10px;border-radius:20px;font-weight:700;
    border:1px solid rgba(255,255,255,.3);
}
.promo-body{position:relative;z-index:1;display:flex;gap:14px;align-items:center;}
.promo-qr{
    width:120px;height:120px;background:#fff;border-radius:12px;padding:8px;flex-shrink:0;
    box-shadow:0 6px 16px rgba(0,0,0,.18);position:relative;
}
.promo-qr::after{
    content:"";position:absolute;left:8px;right:8px;bottom:8px;top:8px;border-radius:6px;
    border:2px dashed rgba(254,44,85,.0);
    pointer-events:none;
}
.promo-qr img{width:100%;height:100%;display:block;border-radius:4px;}
.promo-info{flex:1;min-width:0;}
.promo-tip{font-size:12px;opacity:.95;margin-bottom:8px;line-height:1.5;}
.promo-tip b{font-weight:700;text-shadow:0 1px 2px rgba(0,0,0,.18);}
.promo-url{
    background:rgba(255,255,255,.18);backdrop-filter:blur(10px);
    padding:8px 10px;border-radius:8px;font-size:11px;color:#fff;
    font-family:ui-monospace,Consolas,monospace;margin-bottom:10px;
    word-break:break-all;border:1px solid rgba(255,255,255,.25);
    max-height:48px;overflow:hidden;
}
.promo-copy{
    display:inline-flex;align-items:center;gap:4px;
    background:#fff;color:var(--primary);
    border:none;padding:8px 14px;border-radius:20px;font-size:12px;font-weight:700;
    cursor:pointer;
    box-shadow:0 4px 12px rgba(0,0,0,.15);
    transition:transform .15s;
}
.promo-copy:active{transform:scale(.95);}

/* 收益三联卡 */
.earnings{
    display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:14px;
}
.earn-card{
    position:relative;padding:14px 10px;
    border-radius:14px;text-align:center;
    background:#fff;color:#222;
    box-shadow:0 2px 8px rgba(0,0,0,.04);
    border:1px solid #f0f0f5;
    overflow:hidden;
}
.earn-card::before{
    content:"";position:absolute;top:0;left:0;right:0;height:3px;
    background:linear-gradient(90deg,var(--primary),var(--primary2));
}
.earn-card.green::before{background:linear-gradient(90deg,#16a34a,#5fd6b6);}
.earn-card.blue::before{background:linear-gradient(90deg,#3a8dff,#6cb1ff);}
.earn-card .l{font-size:11px;color:#999;margin-bottom:4px;}
.earn-card .v{font-size:18px;font-weight:700;color:#222;}
.earn-card .v b{color:var(--primary);}
.earn-card.green .v b{color:#16a34a;}
.earn-card.blue .v b{color:#3a8dff;}

label{display:block;font-size:13px;color:#666;margin:10px 0 5px;}
input[type=text],input[type=password],input[type=number],textarea,select{width:100%;padding:10px 12px;border:1px solid #e8e8ef;border-radius:8px;background:#f9fafc;font-size:14px;outline:none;transition:border-color .15s;}
input:focus,textarea:focus,select:focus{border-color:var(--primary);background:#fff;}
textarea{resize:vertical;min-height:70px;}

.btn{display:inline-block;padding:9px 16px;background:var(--grad1);color:#fff;border:none;border-radius:20px;font-size:14px;cursor:pointer;text-decoration:none;font-weight:500;transition:transform .1s,opacity .15s;}
.btn:active{transform:scale(.97);opacity:.85;}
.btn.gray{background:#e0e0e0;color:#333;}
.btn.green{background:linear-gradient(135deg,#11998e 0%,#38ef7d 100%);}
.btn.outline{background:transparent;color:var(--primary);border:1.5px solid var(--primary);}
.btn-block{display:block;width:100%;text-align:center;padding:12px;font-size:15px;font-weight:600;}

.flash{padding:11px 14px;border-radius:10px;margin-bottom:12px;font-size:13px;}
.flash.ok{background:rgba(82,196,26,.1);color:#16a34a;border:1px solid rgba(82,196,26,.3);}
.flash.err{background:rgba(255,77,79,.1);color:#dc2626;border:1px solid rgba(255,77,79,.3);}

.row{display:flex;justify-content:space-between;align-items:center;padding:10px 0;border-bottom:1px solid var(--border);font-size:14px;}
.row:last-child{border-bottom:none;}
.row b{color:var(--primary);font-weight:600;}

.tag{display:inline-block;padding:2px 8px;border-radius:8px;font-size:11px;font-weight:500;}
.tag.vip{background:var(--grad-vip);color:#fff;}
.tag.gray{background:#e0e0e0;color:#666;}
.tag.green{background:#dcfce7;color:#16a34a;}
.tag.red{background:#fee2e2;color:#dc2626;}
.tag.blue{background:#dbeafe;color:#2563eb;}
.tag.yellow{background:#fef3c7;color:#b45309;}

.tabbar{position:fixed;left:0;right:0;bottom:0;background:rgba(255,255,255,.95);backdrop-filter:blur(20px);border-top:1px solid rgba(0,0,0,.05);display:flex;max-width:480px;margin:0 auto;z-index:9;padding:6px 0 env(safe-area-inset-bottom);}
.tabbar a{flex:1;text-align:center;padding:6px 0 4px;font-size:11px;color:#999;text-decoration:none;transition:color .15s;}
.tabbar a.on{color:var(--primary);}
.tabbar a.on .ic{transform:scale(1.1);}
.tabbar a .ic{font-size:20px;display:block;line-height:1;margin-bottom:2px;transition:transform .2s;}

/* ===== 快捷操作 4 框：粉色 + 扫光效果 ===== */
.quick-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin-top:6px;}
.qg{
    position:relative;display:flex;align-items:center;justify-content:center;gap:8px;
    padding:14px 12px;border-radius:12px;
    color:#fff;text-decoration:none;font-size:14px;font-weight:600;
    background:linear-gradient(135deg,#ff5b8a 0%,#ff2c80 50%,#fe2c55 100%);
    box-shadow:0 4px 14px rgba(255,91,138,.32);
    overflow:hidden;cursor:pointer;
    transition:transform .18s, box-shadow .18s;
}
.qg:hover{transform:translateY(-2px);box-shadow:0 8px 20px rgba(255,91,138,.45);}
.qg:active{transform:translateY(0);}
/* 扫光：一条白色斜光从左滑到右，循环 */
.qg::before{
    content:"";position:absolute;top:0;left:-120%;width:60%;height:100%;
    background:linear-gradient(120deg,transparent 0%,rgba(255,255,255,.0) 30%,rgba(255,255,255,.55) 50%,rgba(255,255,255,.0) 70%,transparent 100%);
    transform:skewX(-22deg);
    pointer-events:none;
    animation:qg-shine 2.6s ease-in-out infinite;
}
@keyframes qg-shine{
    0%   { left:-120%; }
    60%  { left:120%;  }
    100% { left:120%;  }
}
.qg-icon{font-size:18px;line-height:1;filter:drop-shadow(0 1px 2px rgba(0,0,0,.18));}
.qg-text{position:relative;z-index:1;text-shadow:0 1px 2px rgba(0,0,0,.18);}
/* 4 个方块扫光错峰，更生动 */
.qg:nth-child(1)::before{animation-delay:0s;}
.qg:nth-child(2)::before{animation-delay:.6s;}
.qg:nth-child(3)::before{animation-delay:1.2s;}
.qg:nth-child(4)::before{animation-delay:1.8s;}

.wlist{display:flex;flex-direction:column;gap:8px;}
.witem{display:flex;justify-content:space-between;align-items:center;padding:11px 12px;background:#f9fafc;border-radius:10px;font-size:13px;}

.works-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin-top:8px;}
.works-grid .wi{position:relative;background:#f5f5f5;border-radius:10px;overflow:hidden;border:1px solid var(--border);}
.works-grid .wi .img-wrap{position:relative;width:100%;aspect-ratio:1/1;overflow:hidden;}
.works-grid .wi img{width:100%;height:100%;object-fit:cover;display:block;}
.works-grid .wi .tag{position:absolute;right:6px;top:6px;font-size:10px;padding:2px 6px;border-radius:6px;}
.works-grid .wi .info{padding:8px 10px;}
.works-grid .wi .info .t{font-size:13px;color:#333;font-weight:500;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.works-grid .wi .info .meta{font-size:11px;color:#999;margin-top:3px;}
.works-grid .wi .reject-box{margin:0 10px 10px;padding:8px 10px;background:#fef2f2;border:1px solid #fecaca;border-radius:8px;color:#dc2626;font-size:12px;line-height:1.5;}

.upload-tabs{display:flex;background:#f5f5f7;border-radius:10px;padding:3px;margin-bottom:14px;}
.upload-tabs label{flex:1;padding:9px;text-align:center;border-radius:8px;cursor:pointer;font-weight:500;font-size:13px;color:#888;margin:0;transition:all .2s;}
.upload-tabs input[type=radio]{display:none;}
.upload-tabs input[type=radio]:checked + span{display:block;background:#fff;color:var(--primary);box-shadow:0 2px 8px rgba(255,44,85,.15);border-radius:8px;padding:9px;font-weight:600;}
.upload-tabs .s{display:block;padding:9px;}

.up-section{display:none;}
.up-section.active{display:block;animation:fadeIn .25s;}
@keyframes fadeIn{from{opacity:0;transform:translateY(4px);}to{opacity:1;transform:translateY(0);}}

.login-box{max-width:340px;margin:0 auto;padding:30px 0;}
.login-logo{width:72px;height:72px;border-radius:20px;background:var(--grad1);margin:0 auto 16px;display:flex;align-items:center;justify-content:center;color:#fff;font-size:32px;font-weight:700;box-shadow:0 8px 24px rgba(255,44,85,.25);}
.login-title{text-align:center;font-size:20px;font-weight:600;margin-bottom:6px;}
.login-sub{text-align:center;font-size:13px;color:var(--sub);margin-bottom:24px;}
.login-input{position:relative;margin-bottom:12px;}
.login-input .li-ic{position:absolute;left:14px;top:50%;transform:translateY(-50%);color:#bbb;font-size:16px;}
.login-input input{padding-left:42px;height:46px;border-radius:23px;background:#f5f5f7;border:1px solid transparent;}
.login-input input:focus{background:#fff;border-color:var(--primary);}
.login-btn{width:100%;height:46px;border-radius:23px;background:var(--grad1);color:#fff;border:none;font-size:15px;font-weight:600;cursor:pointer;margin-top:6px;}

@media (max-width: 360px){
    .uc-stats{grid-template-columns:repeat(3,1fr);padding:10px;}
    .uc-stat .v{font-size:16px;}
    .promo .qr-box{flex-direction:column;align-items:flex-start;}
    .promo .qr-img{width:100px;height:100px;}
}
</style>
</head>
<body>

<div class="uc-header">
    <div class="uc-topbar">
        <a class="back" href="javascript:history.back()">‹</a>
        <h1>个人中心</h1>
        <?php if (!empty($me['username'])): ?>
            <a class="logout" href="login.php?logout=1">退出</a>
        <?php else: ?>
            <a class="logout" href="login.php?tab=login">登录</a>
        <?php endif; ?>
    </div>
    <div class="uc-user">
        <div class="uc-avatar"><?= e(mb_substr($me['nickname'] ?? '瀚', 0, 1, 'UTF-8')) ?></div>
        <div class="uc-info">
            <div class="uname">
                <?= e($me['nickname'] ?? '瀚宇' . $userId) ?>
                <?php if ($isVip): ?><span class="vip">VIP</span><?php endif; ?>
            </div>
            <div class="uid">ID: #<?= (int)$userId ?><?php if (!empty($me['username'])): ?> · @<?= e($me['username']) ?><?php endif; ?></div>
        </div>
    </div>
</div>

<div class="uc-stats">
    <div class="uc-stat">
        <div class="v"><?= $isVip ? '已开通' : '未开通' ?></div>
        <div class="l">会员</div>
    </div>
    <div class="uc-stat">
        <div class="v green">¥<?= number_format((float)($me['agent_commission'] ?? 0), 2) ?></div>
        <div class="l">累计佣金</div>
    </div>
    <div class="uc-stat">
        <div class="v red">¥<?= number_format($availCommission, 2) ?></div>
        <div class="l">可提现</div>
    </div>
</div>

<div class="box">
    <?php foreach ($flashes as $f): ?>
        <div class="flash <?= e($f['type']) ?>"><?= e($f['msg']) ?></div>
    <?php endforeach; ?>

    <?php if ($tab === 'login'): ?>
    <div class="card">
        <h2><span class="ic"></span>账号登录</h2>
        <form method="post" class="login-box">
            <input type="hidden" name="csrf" value="<?= e(csrf_token()) ?>">
            <input type="hidden" name="op" value="login">
            <div class="login-logo">登</div>
            <div class="login-title">欢迎回来</div>
            <div class="login-sub">使用账号密码登录您的会员账户</div>
            <div class="login-input">
                <span class="li-ic"></span>
                <input type="text" name="username" placeholder="请输入账号" required autocomplete="username">
            </div>
            <div class="login-input">
                <span class="li-ic"></span>
                <input type="password" name="password" placeholder="请输入密码" required autocomplete="current-password">
            </div>
            <button class="login-btn" type="submit">立即登录</button>
            <p style="text-align:center;margin-top:14px;font-size:12px;color:var(--sub)">没有账号？<a href="login.php?tab=account" style="color:var(--primary)">设置账号</a></p>
        </form>
    </div>

    <?php elseif ($tab === 'home'): ?>
    <div class="card">
        <h2><span class="ic"></span>快捷操作</h2>
        <div class="quick-grid">
            <a class="qg" href="../vip.php"><span class="qg-icon"></span><span class="qg-text"><?= $isVip?'续费 VIP':'开通 VIP' ?></span></a>
            <a class="qg" href="orders.php"><span class="qg-icon"></span><span class="qg-text">我的订单</span></a>
            <a class="qg" href="login.php?tab=account"><span class="qg-icon"></span><span class="qg-text">账号设置</span></a>
            <a class="qg" href="login.php?tab=agent"><span class="qg-icon"></span><span class="qg-text">分销推广</span></a>
        </div>
    </div>

    <div class="card">
        <h2><span class="ic"></span>我的资料</h2>
        <div class="row"><span>账号</span><b><?= !empty($me['username']) ? '@'.e($me['username']) : '<span style="color:#999">未设置</span>' ?></b></div>
        <div class="row"><span>会员状态</span>
            <b>
            <?php if ($isVip):
                $stmt = db()->prepare('SELECT MAX(end_at) AS e FROM member WHERE user_id = ? AND status = 1');
                $stmt->execute([$userId]);
                $r = $stmt->fetch();
            ?>
                <span class="tag vip">VIP</span> 到期 <?= $r && $r['e'] ? fmt_time((int)$r['e']) : '-' ?>
            <?php else: ?>
                <span class="tag gray">未开通</span>
            <?php endif; ?>
            </b>
        </div>
        <div class="row">
            <span>代理状态</span>
            <b>
            <?php if ($agentStatus === 2): ?><span class="tag green">已认证代理</span>
            <?php elseif ($agentStatus === 1): ?><span class="tag blue">审核中</span>
            <?php else: ?><span class="tag gray">普通用户</span>
            <?php endif; ?>
            </b>
        </div>

        <form method="post" style="margin-top:14px">
            <input type="hidden" name="csrf" value="<?= e(csrf_token()) ?>">
            <input type="hidden" name="op" value="save_nick">
            <label>昵称</label>
            <input type="text" name="nickname" value="<?= e($me['nickname'] ?? '') ?>" placeholder="给自己起个昵称">
            <button class="btn" type="submit" style="margin-top:10px">保存</button>
        </form>
    </div>

    <?php elseif ($tab === 'account'): ?>
    <div class="card">
        <h2><span class="ic"></span>账号设置</h2>
        <?php if (empty($me['username'])): ?>
        <p style="color:var(--sub);font-size:13px;line-height:1.6;margin-bottom:10px">
             您还未设置账号密码<br>
            设置后可在其他设备通过账号密码登录，享受会员权益
        </p>
        <form method="post">
            <input type="hidden" name="csrf" value="<?= e(csrf_token()) ?>">
            <input type="hidden" name="op" value="set_account">
            <label>设置账号</label>
            <input type="text" name="username" placeholder="3-20位字母/数字/下划线" required>
            <label>设置密码</label>
            <input type="password" name="password" placeholder="至少 6 位" required>
            <button class="btn btn-block" type="submit" style="margin-top:14px">保存账号</button>
        </form>
        <?php else: ?>
        <div class="row"><span>当前账号</span><b>@<?= e($me['username']) ?></b></div>
        <form method="post" style="margin-top:14px">
            <input type="hidden" name="csrf" value="<?= e(csrf_token()) ?>">
            <input type="hidden" name="op" value="change_password">
            <label>原密码</label>
            <input type="password" name="old_password" required>
            <label>新密码</label>
            <input type="password" name="new_password" placeholder="至少 6 位" required>
            <button class="btn" type="submit" style="margin-top:10px">修改密码</button>
        </form>
        <p style="color:var(--sub);font-size:12px;margin-top:14px;line-height:1.6">
            💡 提示：在其它设备打开「个人中心」→「账号登录」即可用账号密码登录
        </p>
        <?php endif; ?>
    </div>

    <?php elseif ($tab === 'agent'): ?>
    <div class="card">
        <h2><span class="ic"></span>分销推广</h2>
        <?php if ($agentStatus === 0): ?>
            <div style="background:linear-gradient(135deg,#fff5f7,#ffe0eb);padding:14px;border-radius:12px;margin-bottom:14px;line-height:1.7;font-size:13px;color:#555">
                申请成为代理后，您将获得<b style="color:var(--primary)">专属推广链接</b>和<b style="color:var(--primary)">二维码</b>。<br>
                用户通过您的链接开通 VIP，您可获得订单金额 <b style="color:var(--primary);font-size:16px"><?= (float)config_get('agent_rate','0.2')*100 ?>%</b> 的佣金。
            </div>
            <form method="post">
                <input type="hidden" name="csrf" value="<?= e(csrf_token()) ?>">
                <input type="hidden" name="op" value="apply_agent">
                <button class="btn btn-block" type="submit" style="background:linear-gradient(135deg,#ff5b8a,#fe2c55);box-shadow:0 6px 16px rgba(254,44,85,.3);font-size:15px"> 立即申请成为代理</button>
            </form>
        <?php elseif ($agentStatus === 1): ?>
            <div style="text-align:center;padding:30px 0;color:var(--sub)">
                <div style="font-size:48px;margin-bottom:12px">⏳</div>
                <div style="font-size:15px;color:#333;font-weight:500">申请审核中</div>
                <div style="font-size:12px;margin-top:6px">请耐心等待管理员审核</div>
            </div>
        <?php else: ?>
            <div class="promo">
                <div class="promo-head">
                    <div class="promo-title">专属推广中心</div>
                    <div class="promo-rate">佣金 <?= (float)config_get('agent_rate','0.2')*100 ?>%</div>
                </div>
                <div class="promo-body">
                    <div class="promo-qr"><img id="promoQr" src="" alt="推广二维码"></div>
                    <div class="promo-info">
                        <div class="promo-tip">邀请好友开通 <b>VIP</b>，每单最高可获 <b><?= (float)config_get('agent_rate','0.2')*100 ?>%</b> 佣金奖励</div>
                        <div class="promo-url" id="promoUrl"><?= e($promoUrl) ?></div>
                        <button class="promo-copy" type="button" onclick="copyUrl()"> 一键复制链接</button>
                    </div>
                </div>
            </div>

            <div class="earnings">
                <div class="earn-card">
                    <div class="l">累计佣金</div>
                    <div class="v"><b>¥<?= number_format((float)$me['agent_commission'], 2) ?></b></div>
                </div>
                <div class="earn-card green">
                    <div class="l">已提现</div>
                    <div class="v"><b>¥<?= number_format((float)$me['agent_withdrawn'], 2) ?></b></div>
                </div>
                <div class="earn-card blue">
                    <div class="l">可提现</div>
                    <div class="v"><b>¥<?= number_format($availCommission, 2) ?></b></div>
                </div>
            </div>

            <div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:4px">
                <a class="btn btn-block" href="login.php?tab=withdraw" style="background:var(--grad-vip)"> 申请提现</a>
                <a class="btn btn-block outline" href="login.php?tab=upload"> 上传作品</a>
            </div>
        <?php endif; ?>
    </div>

    <?php elseif ($tab === 'withdraw'): ?>
        <?php if ($agentStatus !== 2): ?>
            <div class="card"><div style="text-align:center;color:var(--sub);padding:40px 0">仅代理可申请提现</div></div>
        <?php else: ?>
        <div class="card">
            <h2><span class="ic"></span>申请提现</h2>
            <div style="background:linear-gradient(135deg,#fff5f7,#ffe0eb);padding:10px 12px;border-radius:8px;margin-bottom:14px;font-size:12px">
                可提现余额：<b style="color:var(--primary);font-size:14px">¥<?= number_format($availCommission, 2) ?></b>
                &nbsp;·&nbsp; 最低提现：¥<?= (float)config_get('withdraw_min','10') ?>
            </div>
            <form method="post" enctype="multipart/form-data">
                <input type="hidden" name="csrf" value="<?= e(csrf_token()) ?>">
                <input type="hidden" name="op" value="apply_withdraw">
                <label>提现金额 (元)</label>
                <input type="number" step="0.01" min="<?= (float)config_get('withdraw_min','10') ?>" max="<?= $availCommission ?>" name="amount" required>
                <label>收款方式</label>
                <select name="pay_type">
                    <option value="wechat">微信</option>
                    <option value="alipay">支付宝</option>
                </select>
                <label>收款账号</label>
                <input type="text" name="account" placeholder="收款微信号/支付宝号" required>
                <label>真实姓名</label>
                <input type="text" name="real_name" placeholder="用于核对" required>
                <label>收款二维码</label>
                <input type="file" name="qr_image" accept="image/*" required>
                <button class="btn btn-block" type="submit" style="margin-top:14px">提交申请</button>
            </form>
        </div>
        <?php endif; ?>

        <div class="card">
            <h2><span class="ic"></span>提现记录</h2>
            <?php if (!$withdraws): ?>
                <div style="text-align:center;color:var(--sub);padding:24px 0">暂无提现记录</div>
            <?php else: ?>
            <div class="wlist">
                <?php foreach ($withdraws as $w):
                    $stTxt = ['待审核','已通过','已驳回'][(int)$w['status']] ?? '未知';
                    $stCls = ['blue','green','red'][(int)$w['status']] ?? 'gray';
                ?>
                <div class="witem">
                    <div style="flex:1">
                        <div style="color:var(--primary);font-weight:700;font-size:16px">¥<?= number_format((float)$w['amount'], 2) ?></div>
                        <div style="color:var(--sub);font-size:11px;margin-top:2px">
                            <?= $w['pay_type']==='alipay'?'支付宝':'微信' ?> · <?= fmt_time((int)$w['created_at']) ?>
                        </div>
                        <?php if ((int)$w['status'] === 2 && !empty($w['reject_reason'])): ?>
                            <div style="color:#dc2626;font-size:11px;margin-top:3px">驳回原因：<?= e($w['reject_reason']) ?></div>
                        <?php endif; ?>
                    </div>
                    <span class="tag <?= $stCls ?>"><?= e($stTxt) ?></span>
                </div>
                <?php endforeach; ?>
            </div>
            <?php endif; ?>
        </div>

    <?php elseif ($tab === 'upload'): ?>
        <?php if ($agentStatus !== 2): ?>
            <div class="card"><div style="text-align:center;color:var(--sub);padding:40px 0">仅已认证代理可上传作品</div></div>
        <?php else: ?>
        <div class="card">
            <h2><span class="ic"></span>上传作品</h2>
            <p style="color:var(--sub);font-size:12px;margin-bottom:12px;background:#fff5f7;padding:8px 10px;border-radius:6px;border-left:3px solid #ff5b8a">传后需经管理员审核，审核通过才会在前台显示</p>
            <form method="post" enctype="multipart/form-data" id="upForm">
                <input type="hidden" name="csrf" value="<?= e(csrf_token()) ?>">
                <input type="hidden" name="op" value="agent_upload">

                <div class="upload-tabs">
                    <label><input type="radio" name="work_type" value="video" checked onchange="switchType()"><span class="s">发布视频</span></label>
                    <label><input type="radio" name="work_type" value="photo" onchange="switchType()"><span class="s">发布照片</span></label>
                </div>

                <div class="up-section active" id="sec-common">
                    <label>作品标题</label>
                    <input type="text" name="title" required>
                    <label>作品描述（选填）</label>
                    <textarea name="description" placeholder="介绍一下这个作品..."></textarea>
                    <label>点赞数（选填）</label>
                    <input type="text" name="likes" value="0" placeholder="例如 1.2万">
                </div>

                <div class="up-section active" id="sec-video">
                    <label>视频文件</label>
                    <input type="file" name="file" accept="video/*">
                    <p style="color:var(--sub);font-size:11px;margin-top:6px">支持 mp4/webm/mov 格式</p>
                </div>

                <div class="up-section" id="sec-photo">
                    <label> 照片文件（可多张）</label>
                    <input type="file" name="photos[]" accept="image/*" multiple>
                    <p style="color:var(--sub);font-size:11px;margin-top:6px">支持 jpg/png/webp，按住 Ctrl/Shift 多选</p>
                </div>

                <div class="up-section active" id="sec-cover">
                    <label>封面图 <span id="coverRequiredHint" style="color:var(--primary)">*</span></label>
                    <input type="file" name="cover" accept="image/*">
                    <p style="color:var(--sub);font-size:11px;margin-top:6px" id="coverTip">视频封面图必填；上传照片时可留空，自动使用第一张</p>
                </div>

                <button class="btn btn-block" type="submit" style="margin-top:18px">立即上传</button>
            </form>
        </div>

        <div class="card">
            <h2><span class="ic"></span>我的作品</h2>
            <?php if (!$myWorks): ?>
                <div style="text-align:center;color:var(--sub);padding:30px 0">还没有上传过作品</div>
            <?php else: ?>
            <div class="works-grid">
                <?php foreach ($myWorks as $w):
                    $rs = (int)$w['review_status'];
                    $rsTxt = ['待审核','已通过','已驳回'][$rs] ?? '未知';
                    $rsCls = ['yellow','green','red'][$rs] ?? 'gray';
                ?>
                <div class="wi">
                    <div class="img-wrap">
                        <img src="../<?= e($w['cover']) ?>" alt="">
                        <span class="tag <?= $rsCls ?>"><?= e($rsTxt) ?></span>
                    </div>
                    <div class="info">
                        <div class="t"><?= e($w['title']) ?></div>
                        <div class="meta"><?= fmt_time((int)$w['created_at']) ?></div>
                    </div>
                    <?php if ($rs === 2 && !empty($w['reject_reason'])): ?>
                    <div class="reject-box">
                        <b>❌ 驳回原因：</b><?= e($w['reject_reason']) ?>
                    </div>
                    <?php endif; ?>
                </div>
                <?php endforeach; ?>
            </div>
            <?php endif; ?>
        </div>
        <?php endif; ?>

    <?php endif; ?>
</div>

<div class="tabbar">
   
</div>

<script>
function copyText(el){
    var r = document.createRange();
    r.selectNodeContents(el);
    var s = window.getSelection();
    s.removeAllRanges();
    s.addRange(r);
    try { document.execCommand('copy'); } catch(e) {}
    s.removeAllRanges();
}
function toast(msg){
    var d = document.createElement('div');
    d.textContent = msg;
    d.style.cssText = 'position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:rgba(0,0,0,.85);color:#fff;padding:12px 22px;border-radius:24px;font-size:14px;font-weight:500;z-index:9999;box-shadow:0 8px 24px rgba(0,0,0,.3);animation:toastIn .25s ease';
    document.body.appendChild(d);
    setTimeout(function(){d.style.opacity='0';d.style.transition='opacity .3s';setTimeout(function(){d.remove();},300);},1500);
}
function copyUrl(){
    var el = document.getElementById('promoUrl');
    if (!el) return;
    var text = el.textContent.trim();
    if (navigator.clipboard && navigator.clipboard.writeText) {
        navigator.clipboard.writeText(text).then(function(){toast('✓ 链接已复制');},function(){copyText(el);toast('✓ 链接已复制');});
    } else {
        copyText(el);
        toast('✓ 链接已复制');
    }
}
function switchType(){
    var t = document.querySelector('input[name=work_type]:checked').value;
    document.getElementById('sec-video').classList.toggle('active', t === 'video');
    document.getElementById('sec-photo').classList.toggle('active', t === 'photo');
    var hint = document.getElementById('coverRequiredHint');
    var tip  = document.getElementById('coverTip');
    if (hint && tip) {
        if (t === 'video') {
            hint.style.display = '';
            tip.textContent = '视频封面图必填';
        } else {
            hint.style.display = 'none';
            tip.textContent = '封面图选填，不传则自动使用第一张照片';
        }
    }
}
<?php if ($agentStatus === 2 && $promoUrl): ?>
(function(){
    var url = <?= json_encode($promoUrl) ?>;
    var qrApi = 'https://api.qrserver.com/v1/create-qr-code/?size=200x200&margin=0&data=' + encodeURIComponent(url);
    var img = document.getElementById('promoQr');
    if (img) img.src = qrApi;
})();
<?php endif; ?>
</script>
</body>
</html>
