-- Fix ambiguous column reference errors in stats functions.
--
-- If earlier migrations have already been applied, editing them will not update
-- the deployed database. This migration re-defines the functions using
-- CREATE OR REPLACE so the corrected definitions take effect.

CREATE OR REPLACE FUNCTION update_and_get_stats()
RETURNS TABLE (
  pokemon_caught BIGINT,
  total_users BIGINT,
  completed_pokedexes BIGINT,
  updated_at TIMESTAMPTZ
)
SECURITY DEFINER
LANGUAGE plpgsql
AS $$
DECLARE
  v_pokemon_caught BIGINT;
  v_total_users BIGINT;
  v_completed_pokedexes BIGINT;
BEGIN
  -- Calculate current stats: count of caught Pokémon
  SELECT COUNT(*) INTO v_pokemon_caught
  FROM catch_records
  WHERE caught = true;

  -- Calculate current stats: count of total users
  SELECT COUNT(*) INTO v_total_users
  FROM auth.users;

  -- Calculate current stats: count of completed pokedexes
  -- A pokedex is completed when all its entries have caught = true
  SELECT COUNT(*) INTO v_completed_pokedexes
  FROM (
    SELECT "pokedexId"
    FROM catch_records
    GROUP BY "pokedexId"
    HAVING COUNT(*) = COUNT(*) FILTER (WHERE caught = true)
  ) completed;

  -- Update cache using UPSERT pattern
  INSERT INTO stats_cache (pokemon_caught, total_users, completed_pokedexes, updated_at)
  VALUES (v_pokemon_caught, v_total_users, v_completed_pokedexes, NOW())
  ON CONFLICT (id) DO UPDATE
  SET pokemon_caught = EXCLUDED.pokemon_caught,
      total_users = EXCLUDED.total_users,
      completed_pokedexes = EXCLUDED.completed_pokedexes,
      updated_at = NOW();

  -- Return stats
  RETURN QUERY
  SELECT v_pokemon_caught, v_total_users, v_completed_pokedexes, NOW() AS updated_at;
END;
$$;


CREATE OR REPLACE FUNCTION get_public_stats()
RETURNS TABLE (
  pokemon_caught BIGINT,
  total_users BIGINT,
  completed_pokedexes BIGINT,
  updated_at TIMESTAMPTZ
)
SECURITY DEFINER
LANGUAGE plpgsql
AS $$
DECLARE
  v_cache_exists BOOLEAN;
BEGIN
  -- Check if cache exists and is fresh (within 24 hours)
  SELECT EXISTS(
    SELECT 1 FROM stats_cache
    WHERE stats_cache.updated_at > NOW() - INTERVAL '24 hours'
  ) INTO v_cache_exists;

  IF v_cache_exists THEN
    -- Return cached stats (qualify updated_at to avoid ambiguity with output parameter)
    RETURN QUERY
    SELECT sc.pokemon_caught, sc.total_users, sc.completed_pokedexes, sc.updated_at
    FROM stats_cache sc
    ORDER BY sc.updated_at DESC
    LIMIT 1;
  ELSE
    -- Cache is stale or doesn't exist, update it
    RETURN QUERY
    SELECT * FROM update_and_get_stats();
  END IF;
END;
$$;
