"""Katana DEX (Ronin) by the numbers: daily TVL, trading volume and fees since launch.

All figures come from DefiLlama's public API at run time:
- TVL: api.llama.fi/protocol/katana-dex (V2) and katana-dex-v3 (V3)
- Volume: api.llama.fi/summary/dexs/<slug>?dataType=dailyVolume
- Fees and revenue: api.llama.fi/summary/fees/<slug>?dataType=dailyFees|dailyRevenue
DefiLlama's fee series for V2 starts on 2024-12-31, so earlier V2 fee cells are empty, not zero.

Usage: python katana_dex_stats.py [--outdir .]
"""
import csv
import datetime as dt
import json
import os
import sys
import urllib.request

API = 'https://api.llama.fi'
SLUGS = {'v2': 'katana-dex', 'v3': 'katana-dex-v3'}


def get(path):
    req = urllib.request.Request(API + path, headers={'User-Agent': 'Mozilla/5.0'})
    with urllib.request.urlopen(req, timeout=90) as r:
        return json.loads(r.read())


def day(ts):
    return dt.datetime.fromtimestamp(ts, dt.timezone.utc).date().isoformat()


def main():
    a = sys.argv
    outdir = a[a.index('--outdir') + 1] if '--outdir' in a else '.'
    cols = {}
    for v, slug in SLUGS.items():
        cols[f'tvl_{v}_usd'] = {day(r['date']): r['totalLiquidityUSD'] for r in get(f'/protocol/{slug}')['tvl']}
        cols[f'volume_{v}_usd'] = {day(t): x for t, x in get(f'/summary/dexs/{slug}?dataType=dailyVolume')['totalDataChart']}
        cols[f'fees_{v}_usd'] = {day(t): x for t, x in get(f'/summary/fees/{slug}?dataType=dailyFees')['totalDataChart']}
    cols['revenue_v2_usd'] = {day(t): x for t, x in get('/summary/fees/katana-dex?dataType=dailyRevenue')['totalDataChart']}

    today = dt.datetime.now(dt.timezone.utc).date().isoformat()
    days = sorted({d for c in cols.values() for d in c if d < today})
    rows = []
    for d in days:
        r = {'date_utc': d}
        for k, c in cols.items():
            r[k] = round(c[d], 2) if d in c else None
        rows.append(r)

    monthly = {}
    for r in rows:
        m = monthly.setdefault(r['date_utc'][:7], {'month': r['date_utc'][:7], 'volume_v2_usd': 0, 'volume_v3_usd': 0, 'fees_usd': 0, 'end_tvl_usd': None})
        m['volume_v2_usd'] += r['volume_v2_usd'] or 0
        m['volume_v3_usd'] += r['volume_v3_usd'] or 0
        m['fees_usd'] += (r['fees_v2_usd'] or 0) + (r['fees_v3_usd'] or 0)
        if r['tvl_v2_usd'] is not None:
            m['end_tvl_usd'] = round(r['tvl_v2_usd'] + (r['tvl_v3_usd'] or 0), 2)
    monthly = [{k: round(v, 2) if isinstance(v, float) else v for k, v in m.items()} for m in monthly.values()]

    tvl = [(r['date_utc'], r['tvl_v2_usd'] + (r['tvl_v3_usd'] or 0)) for r in rows if r['tvl_v2_usd'] is not None]
    peak = max(tvl, key=lambda x: x[1])
    last = tvl[-1]
    vol = [(r['date_utc'], (r['volume_v2_usd'] or 0) + (r['volume_v3_usd'] or 0)) for r in rows]
    vpeak = max(vol, key=lambda x: x[1])
    l30 = rows[-30:]
    summary = {
        'generated_utc': dt.datetime.now(dt.timezone.utc).strftime('%Y-%m-%d %H:%M UTC'),
        'source': 'DefiLlama public API (katana-dex, katana-dex-v3)',
        'first_day': rows[0]['date_utc'], 'last_day': rows[-1]['date_utc'],
        'peak_tvl_usd': round(peak[1]), 'peak_tvl_date': peak[0],
        'latest_tvl_usd': round(last[1]), 'latest_tvl_date': last[0],
        'latest_tvl_v2_usd': round(rows[-1]['tvl_v2_usd'] or 0), 'latest_tvl_v3_usd': round(rows[-1]['tvl_v3_usd'] or 0),
        'tvl_change_from_peak_pct': round((last[1] / peak[1] - 1) * 100, 1),
        'all_time_volume_usd': round(sum(v for _, v in vol)),
        'all_time_volume_v2_usd': round(sum(r['volume_v2_usd'] or 0 for r in rows)),
        'all_time_volume_v3_usd': round(sum(r['volume_v3_usd'] or 0 for r in rows)),
        'peak_day_volume_usd': round(vpeak[1]), 'peak_day_volume_date': vpeak[0],
        'last_30d_volume_usd': round(sum((r['volume_v2_usd'] or 0) + (r['volume_v3_usd'] or 0) for r in l30)),
        'last_30d_fees_usd': round(sum((r['fees_v2_usd'] or 0) + (r['fees_v3_usd'] or 0) for r in l30)),
        'last_30d_v3_share_of_volume_pct': round(100 * sum(r['volume_v3_usd'] or 0 for r in l30) / max(sum((r['volume_v2_usd'] or 0) + (r['volume_v3_usd'] or 0) for r in l30), 1), 1),
        'days': len(rows),
    }

    stamp = rows[-1]['date_utc']
    with open(os.path.join(outdir, f'katana-dex-daily-{stamp}.csv'), 'w', newline='') as f:
        w = csv.DictWriter(f, fieldnames=list(rows[0]))
        w.writeheader()
        w.writerows(rows)
    with open(os.path.join(outdir, f'katana-dex-monthly-{stamp}.csv'), 'w', newline='') as f:
        w = csv.DictWriter(f, fieldnames=list(monthly[0]))
        w.writeheader()
        w.writerows(monthly)
    json.dump({'summary': summary, 'monthly': monthly}, open(os.path.join(outdir, f'katana-dex-stats-{stamp}.json'), 'w'), indent=2)
    print(json.dumps(summary, indent=2))


if __name__ == '__main__':
    main()
