-- Dashboard summary table + pg_cron hourly refresh
-- Run this in the Supabase SQL Editor

-- 1. Create the summary table (single row, updated hourly)
CREATE TABLE IF NOT EXISTS dashboard_summary (
  id text PRIMARY KEY DEFAULT 'current',
  updated_at timestamptz DEFAULT now(),
  total_tokens_saved bigint DEFAULT 0,
  total_cost_saved numeric DEFAULT 0,
  total_requests int DEFAULT 0,
  unique_instances int DEFAULT 0,
  active_days int DEFAULT 0,
  daily_stats jsonb DEFAULT '[]'::jsonb,
  hourly_stats jsonb DEFAULT '[]'::jsonb,
  top_instances jsonb DEFAULT '[]'::jsonb,
  os_breakdown jsonb DEFAULT '{}'::jsonb,
  version_breakdown jsonb DEFAULT '{}'::jsonb
);

-- 2. RLS: anon can SELECT (public dashboard), only postgres can write
ALTER TABLE dashboard_summary ENABLE ROW LEVEL SECURITY;

CREATE POLICY "Public read access" ON dashboard_summary
  FOR SELECT USING (true);

-- 3. The aggregation function (called by pg_cron)
CREATE OR REPLACE FUNCTION refresh_dashboard_summary()
RETURNS void AS $$
DECLARE
  _daily jsonb;
  _hourly jsonb;
  _top jsonb;
  _os jsonb;
  _versions jsonb;
  _total_tokens bigint;
  _total_cost numeric;
  _total_requests int;
  _unique_instances int;
  _active_days int;
BEGIN
  -- Daily totals: MAX per instance per day (beacon is cumulative), then SUM across instances
  WITH instance_daily AS (
    SELECT
      instance_id,
      created_at::date AS day,
      MAX(COALESCE(tokens_saved, 0)) AS tokens_saved,
      MAX(COALESCE(cost_saved_usd, 0)) AS cost_saved,
      MAX(COALESCE(requests, 0)) AS requests
    FROM proxy_telemetry_v2
    GROUP BY instance_id, created_at::date
  ),
  daily_agg AS (
    SELECT
      day,
      SUM(tokens_saved) AS tokens_saved,
      SUM(cost_saved)::numeric(12,2) AS cost_saved,
      SUM(requests) AS requests,
      COUNT(DISTINCT instance_id) AS instances
    FROM instance_daily
    GROUP BY day
    ORDER BY day
  )
  SELECT
    COALESCE(jsonb_agg(jsonb_build_object(
      'date', day,
      'tokens_saved', tokens_saved,
      'cost_saved', cost_saved,
      'requests', requests,
      'instances', instances
    ) ORDER BY day), '[]'::jsonb),
    COALESCE(SUM(tokens_saved), 0),
    COALESCE(SUM(cost_saved), 0),
    COALESCE(SUM(requests), 0),
    COUNT(DISTINCT day)
  INTO _daily, _total_tokens, _total_cost, _total_requests, _active_days
  FROM daily_agg;

  -- Hourly totals: last 48 hours, MAX per instance per hour, then SUM across instances
  WITH instance_hourly AS (
    SELECT
      instance_id,
      date_trunc('hour', created_at) AS hour,
      MAX(COALESCE(tokens_saved, 0)) AS tokens_saved,
      MAX(COALESCE(cost_saved_usd, 0)) AS cost_saved,
      MAX(COALESCE(requests, 0)) AS requests
    FROM proxy_telemetry_v2
    WHERE created_at >= now() - interval '48 hours'
    GROUP BY instance_id, date_trunc('hour', created_at)
  ),
  hourly_agg AS (
    SELECT
      hour,
      SUM(tokens_saved) AS tokens_saved,
      SUM(cost_saved)::numeric(12,2) AS cost_saved,
      SUM(requests) AS requests,
      COUNT(DISTINCT instance_id) AS instances
    FROM instance_hourly
    GROUP BY hour
    ORDER BY hour
  )
  SELECT COALESCE(jsonb_agg(jsonb_build_object(
    'hour', to_char(hour, 'YYYY-MM-DD HH24:MI'),
    'tokens_saved', tokens_saved,
    'cost_saved', cost_saved,
    'requests', requests,
    'instances', instances
  ) ORDER BY hour), '[]'::jsonb)
  INTO _hourly
  FROM hourly_agg;

  -- Unique instances
  SELECT COUNT(DISTINCT instance_id) INTO _unique_instances FROM proxy_telemetry_v2;

  -- Top 20 instances by total tokens saved
  WITH instance_totals AS (
    SELECT
      instance_id,
      SUM(max_tokens) AS tokens_saved,
      SUM(max_cost)::numeric(12,2) AS cost_saved,
      MAX(os) AS os,
      MAX(version) AS version
    FROM (
      SELECT
        instance_id,
        created_at::date,
        MAX(COALESCE(tokens_saved, 0)) AS max_tokens,
        MAX(COALESCE(cost_saved_usd, 0)) AS max_cost,
        MAX(os) AS os,
        MAX(headroom_version) AS version
      FROM proxy_telemetry_v2
      GROUP BY instance_id, created_at::date
    ) sub
    GROUP BY instance_id
    ORDER BY tokens_saved DESC
    LIMIT 20
  )
  SELECT COALESCE(jsonb_agg(jsonb_build_object(
    'instance_id', LEFT(instance_id, 8),
    'tokens_saved', tokens_saved,
    'cost_saved', cost_saved,
    'os', SPLIT_PART(COALESCE(os, '?'), ' ', 1),
    'version', version
  ) ORDER BY tokens_saved DESC), '[]'::jsonb)
  INTO _top
  FROM instance_totals;

  -- OS breakdown
  SELECT COALESCE(jsonb_object_agg(os_name, cnt), '{}'::jsonb)
  INTO _os
  FROM (
    SELECT SPLIT_PART(COALESCE(os, '?'), ' ', 1) AS os_name, COUNT(*) AS cnt
    FROM proxy_telemetry_v2
    GROUP BY os_name
  ) sub;

  -- Version breakdown
  SELECT COALESCE(jsonb_object_agg(COALESCE(headroom_version, '?'), cnt), '{}'::jsonb)
  INTO _versions
  FROM (
    SELECT headroom_version, COUNT(*) AS cnt
    FROM proxy_telemetry_v2
    GROUP BY headroom_version
  ) sub;

  -- Upsert the single summary row
  INSERT INTO dashboard_summary (id, updated_at, total_tokens_saved, total_cost_saved,
    total_requests, unique_instances, active_days, daily_stats, hourly_stats,
    top_instances, os_breakdown, version_breakdown)
  VALUES ('current', now(), _total_tokens, _total_cost, _total_requests,
    _unique_instances, _active_days, _daily, _hourly, _top, _os, _versions)
  ON CONFLICT (id) DO UPDATE SET
    updated_at = EXCLUDED.updated_at,
    total_tokens_saved = EXCLUDED.total_tokens_saved,
    total_cost_saved = EXCLUDED.total_cost_saved,
    total_requests = EXCLUDED.total_requests,
    unique_instances = EXCLUDED.unique_instances,
    active_days = EXCLUDED.active_days,
    daily_stats = EXCLUDED.daily_stats,
    hourly_stats = EXCLUDED.hourly_stats,
    top_instances = EXCLUDED.top_instances,
    os_breakdown = EXCLUDED.os_breakdown,
    version_breakdown = EXCLUDED.version_breakdown;
END;
$$ LANGUAGE plpgsql;

-- 4. Run it once to populate
SELECT refresh_dashboard_summary();

-- 5. Enable pg_cron extension (if not already)
CREATE EXTENSION IF NOT EXISTS pg_cron;

-- 6. Schedule hourly refresh (runs at minute 7 to avoid :00 congestion)
SELECT cron.schedule(
  'refresh-dashboard',
  '7 * * * *',
  'SELECT refresh_dashboard_summary()'
);

-- Verify the schedule
SELECT * FROM cron.job;
