CREATE OR REPLACE VIEW month_tracks AS
WITH track_stats AS (
  SELECT
    ol.track_name,
    ol.artist_name,
    ol.album_name,
    COUNT(*) AS plays,
    MAX(ol.listened_at) AS last_listened,
    ol.album_art,
    ol.artist_url,
    MAX(COUNT(*)) OVER () AS most_played
  FROM
    optimized_listens ol
  WHERE
    TO_TIMESTAMP(ol.listened_at) >= NOW() - INTERVAL '30 days'
  GROUP BY
    ol.track_name,
    ol.artist_name,
    ol.album_name,
    ol.album_art,
    ol.artist_url
)
SELECT
  track_name,
  artist_name,
  album_name,
  plays,
  last_listened,
  album_art,
  artist_url,
  json_build_object('title', track_name, 'artist', artist_name, 'url', artist_url, 'plays', plays, 'alt', CONCAT(track_name, ' by ', artist_name), 'subtext', CONCAT(album_name, ' (', plays, ' plays)'), 'percentage', ROUND((plays::decimal / most_played) * 100, 2)) AS chart
FROM
  track_stats
ORDER BY
  plays DESC,
  last_listened DESC;