<?php
$page_title = 'Subscriptions';
require __DIR__ . '/_guard.php';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    csrf_verify();
    if (($_POST['do'] ?? '') === 'toggle_status') {
        $id     = (int)$_POST['sub_id'];
        $status = $_POST['new_status'] ?? '';
        if (in_array($status, ['active','cancelled','failed'], true)) {
            db_exec('UPDATE payment_tokens SET status=:s WHERE id=:id', ['s'=>$status,'id'=>$id]);
        }
        header('Location: subscriptions.php?' . http_build_query($_GET)); exit;
    }
}

$filter = $_GET['filter'] ?? 'active';
$q      = trim($_GET['q'] ?? '');
$where  = ['1=1'];
$params = [];

if ($filter === 'active')    $where[] = "pt.status='active'";
if ($filter === 'cancelled') $where[] = "pt.status='cancelled'";
if ($filter === 'failed')    $where[] = "pt.status='failed'";

if ($q !== '') {
    $where[] = "(m.email LIKE :q1 OR m.business_name LIKE :q2 OR m.first_name LIKE :q3 OR m.last_name LIKE :q4)";
    $params['q1'] = '%'.$q.'%';
    $params['q2'] = '%'.$q.'%';
    $params['q3'] = '%'.$q.'%';
    $params['q4'] = '%'.$q.'%';
}

if ($filter === 'none') {
    $subs = db_all(
        "SELECT m.id AS member_id, m.email, m.first_name, m.last_name, m.business_name,
                m.tier, m.status AS member_status, m.renewal_date,
                NULL AS sub_id, NULL AS sub_status, NULL AS token,
                NULL AS last_charge_at, NULL AS next_charge_at, NULL AS gateway, NULL AS created_at
           FROM members m LEFT JOIN payment_tokens pt ON pt.member_id=m.id
           WHERE pt.id IS NULL AND m.status IN ('active','pending')
             ".($q!=='' ? "AND (m.email LIKE :q1 OR m.business_name LIKE :q2)" : "")."
           ORDER BY m.created_at DESC LIMIT 200",
        $q!=='' ? ['q1'=>'%'.$q.'%', 'q2'=>'%'.$q.'%'] : []
    );
} else {
    $subs = db_all(
        "SELECT m.id AS member_id, m.email, m.first_name, m.last_name, m.business_name,
                m.tier, m.status AS member_status, m.renewal_date,
                pt.id AS sub_id, pt.status AS sub_status, pt.token,
                pt.last_charge_at, pt.next_charge_at, pt.gateway, pt.created_at
           FROM payment_tokens pt
           JOIN members m ON m.id=pt.member_id
           WHERE ".implode(' AND ', $where)."
           ORDER BY CASE pt.status WHEN 'active' THEN 1 WHEN 'failed' THEN 2 ELSE 3 END,
                    pt.next_charge_at ASC
           LIMIT 500",
        $params
    );
}

$counts = [
    'active'    => (int)db_value("SELECT COUNT(*) FROM payment_tokens WHERE status='active'"),
    'failed'    => (int)db_value("SELECT COUNT(*) FROM payment_tokens WHERE status='failed'"),
    'cancelled' => (int)db_value("SELECT COUNT(*) FROM payment_tokens WHERE status='cancelled'"),
    'none'      => (int)db_value(
        "SELECT COUNT(*) FROM members m LEFT JOIN payment_tokens pt ON pt.member_id=m.id
          WHERE pt.id IS NULL AND m.status IN ('active','pending')"
    ),
];

// MRR: active subscriptions only — latest paid invoice per active subscriber
$mrr = (int)db_value(
    "SELECT COALESCE(SUM(i.amount_cents),0)
       FROM invoices i
       INNER JOIN (
           SELECT member_id, MAX(id) AS max_id FROM invoices
            WHERE type='membership' AND status='paid' GROUP BY member_id
       ) latest ON latest.max_id=i.id
       INNER JOIN payment_tokens pt ON pt.member_id=i.member_id
       WHERE pt.status='active'"
);

$upcoming7 = (int)db_value(
    "SELECT COUNT(*) FROM payment_tokens
      WHERE status='active'
        AND next_charge_at BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)"
);

function cents_to_rand(int $c): string { return 'R '.number_format($c/100,2,'.','&nbsp;'); }
?>

<style>
.s-stat { background:#fff; border:1px solid var(--line); border-radius:var(--radius); padding:1.25rem; text-align:center; }
.s-stat .lbl { font-size:.72rem; text-transform:uppercase; letter-spacing:.05em; color:var(--ink-muted); margin:0 0 .25rem; }
.s-stat .val { font-size:1.9rem; font-weight:800; line-height:1.1; margin:0; }
.s-stat .sub { font-size:.75rem; color:var(--ink-muted); margin:.25rem 0 0; }
.atbl { width:100%; border-collapse:collapse; font-size:.875rem; }
.atbl th { padding:.55rem .9rem; background:var(--surface-alt); font-size:.72rem;
           text-transform:uppercase; letter-spacing:.05em; color:var(--ink-muted);
           border-bottom:2px solid var(--line); white-space:nowrap; text-align:left; }
.atbl td { padding:.6rem .9rem; border-bottom:1px solid var(--line); vertical-align:middle; }
.atbl tr:last-child td { border-bottom:none; }
.atbl tbody tr:hover td { background:var(--surface-alt); }
.ftab { display:inline-flex; align-items:center; gap:.4rem; padding:.3rem .85rem;
        border-radius:999px; font-size:.82rem; border:1px solid var(--line);
        text-decoration:none; color:var(--ink); }
.ftab.on { background:var(--brand-primary); color:#fff; border-color:var(--brand-primary); }
.ftab.warn { border-color:var(--brand-accent); color:var(--brand-accent); }
.ftab.warn.on { background:var(--brand-accent); color:#fff; }
.ftab .cnt { background:rgba(0,0,0,.12); border-radius:999px;
             padding:.05em .45em; font-size:.78em; font-weight:700; }
.tb { display:inline-block; padding:.15em .55em; border-radius:3px;
      font-size:.7rem; font-weight:700; text-transform:uppercase; letter-spacing:.04em; }
.tb-bronze   { background:#cd7f32; color:#fff; }
.tb-silver   { background:#a0a0ad; color:#fff; }
.tb-gold     { background:#c9a227; color:#fff; }
.tb-platinum { background:#6a5acd; color:#fff; }
.tb-diamond  { background:#1a1a2e; color:#fff; }
</style>

<section class="section">
<div class="container">

<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:1.25rem;">
    <h1 style="margin:0;">Subscriptions</h1>
    <a href="subscription-edit.php?action=add" class="btn">+ Add manual</a>
</div>

<?php if (isset($_GET['msg'])): ?>
    <div class="alert alert-success" data-autohide><?= htmlspecialchars($_GET['msg']) ?></div>
<?php endif; ?>

<!-- Stats row -->
<div style="display:grid;grid-template-columns:repeat(4,1fr);gap:.9rem;margin-bottom:1.5rem;">
    <div class="s-stat">
        <p class="lbl">Active subscriptions</p>
        <p class="val" style="color:var(--brand-primary);"><?= $counts['active'] ?></p>
        <p class="sub">PayFast + manual</p>
    </div>
    <div class="s-stat">
        <p class="lbl">Monthly recurring</p>
        <p class="val"><?= cents_to_rand($mrr) ?></p>
        <p class="sub">Active only — excl. cancelled</p>
    </div>
    <div class="s-stat">
        <p class="lbl">Renewing in 7 days</p>
        <p class="val" style="color:<?= $upcoming7>0?'var(--brand-accent)':'inherit' ?>;"><?= $upcoming7 ?></p>
        <p class="sub">upcoming charges</p>
    </div>
    <div class="s-stat">
        <p class="lbl">No subscription</p>
        <p class="val" style="color:<?= $counts['none']>0?'var(--brand-accent)':'inherit' ?>;"><?= $counts['none'] ?></p>
        <p class="sub">active members</p>
    </div>
</div>

<!-- Filter bar -->
<div style="display:flex;gap:.5rem;align-items:center;flex-wrap:wrap;margin-bottom:1.1rem;">
    <a href="?filter=active"    class="ftab <?= $filter==='active'?'on':'' ?>">
        Active <span class="cnt"><?= $counts['active'] ?></span>
    </a>
    <a href="?filter=failed"    class="ftab warn <?= $filter==='failed'?'on':'' ?>">
        Failed <span class="cnt"><?= $counts['failed'] ?></span>
    </a>
    <a href="?filter=none"      class="ftab warn <?= $filter==='none'?'on':'' ?>">
        No subscription <span class="cnt"><?= $counts['none'] ?></span>
    </a>
    <a href="?filter=cancelled" class="ftab <?= $filter==='cancelled'?'on':'' ?>">
        Cancelled <span class="cnt"><?= $counts['cancelled'] ?></span>
    </a>

    <form method="get" style="display:flex;gap:.4rem;margin-left:auto;">
        <input type="hidden" name="filter" value="<?= htmlspecialchars($filter) ?>">
        <input type="search" name="q" value="<?= htmlspecialchars($q) ?>"
               placeholder="Search member…" style="width:200px;">
        <button type="submit" class="btn btn-outline">Search</button>
        <?php if ($q): ?>
            <a href="?filter=<?= htmlspecialchars($filter) ?>" class="btn btn-outline">✕</a>
        <?php endif; ?>
    </form>
</div>

<!-- Table -->
<?php if (empty($subs)): ?>
    <div class="card"><p class="muted" style="margin:0;">No subscriptions match this filter.</p></div>
<?php else: ?>
<div class="card" style="padding:0;overflow:auto;">
    <table class="atbl">
        <thead>
            <tr>
                <th>Business</th>
                <th>Member</th>
                <th>Tier</th>
                <th>Sub status</th>
                <th>Member status</th>
                <th>Last charged</th>
                <th>Next charge</th>
                <th>Gateway</th>
                <th>Actions</th>
            </tr>
        </thead>
        <tbody>
        <?php foreach ($subs as $s):
            $sub_s = $s['sub_status'] ?? 'none';
            if ($sub_s==='active')         { $sc='tag-ok';  $sl='Active'; }
            elseif ($sub_s==='failed')     { $sc='tag-err'; $sl='Failed'; }
            elseif ($sub_s==='cancelled')  { $sc='tag-err'; $sl='Cancelled'; }
            else                           { $sc='muted';   $sl='None'; }

            $ms  = $s['member_status'];
            $mc  = $ms==='active'?'tag-ok':'tag-err';
            $tier_lc = strtolower($s['tier']);

            $days = null;
            if ($s['next_charge_at']) {
                $days = (int)ceil((strtotime($s['next_charge_at'])-time())/86400);
            }
        ?>
            <tr>
                <td><strong><?= htmlspecialchars($s['business_name']) ?></strong></td>
                <td>
                    <?= htmlspecialchars($s['first_name'].' '.$s['last_name']) ?><br>
                    <small class="muted"><?= htmlspecialchars($s['email']) ?></small>
                </td>
                <td><span class="tb tb-<?= $tier_lc ?>"><?= htmlspecialchars($s['tier']) ?></span></td>
                <td><span class="tag <?= $sc ?>"><?= $sl ?></span></td>
                <td><span class="tag <?= $mc ?>"><?= htmlspecialchars($ms) ?></span></td>
                <td class="muted">
                    <?= $s['last_charge_at'] ? date('j M Y', strtotime($s['last_charge_at'])) : '—' ?>
                </td>
                <td>
                    <?php if ($s['next_charge_at']): ?>
                        <?= date('j M Y', strtotime($s['next_charge_at'])) ?>
                        <?php if ($days!==null && $days<=7 && $days>=0): ?>
                            <span class="tag tag-err" style="font-size:.7rem;"><?= $days ?>d</span>
                        <?php endif; ?>
                    <?php else: ?>
                        <span class="muted">—</span>
                    <?php endif; ?>
                </td>
                <td class="muted" style="font-size:.8rem;"><?= htmlspecialchars($s['gateway']??'—') ?></td>
                <td style="white-space:nowrap;">
                    <?php if (!empty($s['sub_id'])): ?>
                        <a href="subscription-edit.php?id=<?= $s['sub_id'] ?>">Edit</a>
                        &nbsp;·&nbsp;
                    <?php else: ?>
                        <a href="subscription-edit.php?action=add&member_id=<?= $s['member_id'] ?>">Add sub</a>
                        &nbsp;·&nbsp;
                    <?php endif; ?>
                    <a href="member-edit.php?id=<?= $s['member_id'] ?>">Member</a>
                </td>
            </tr>
        <?php endforeach; ?>
        </tbody>
    </table>
</div>
<p class="muted" style="font-size:.8rem;margin:.5rem 0 0;">
    <?= count($subs) ?> result<?= count($subs)===1?'':'s' ?>.
</p>
<?php endif; ?>

</div>
</section>
<?php require __DIR__ . '/_footer.php'; ?>