package main

import (
	"fmt"
	"log"

	"gitea.seeseepuff.be/seeseemelk/mysqlite"
)

func CalculateEpisodeNumbers(db *mysqlite.Db) error {
	log.Printf("Calculating episode numbers")

	// Start a transaction
	tx, err := db.Begin()
	if err != nil {
		return fmt.Errorf("error starting transaction: %w", err)
	}
	defer tx.MustRollback()

	query := `
		select v.upload_date,
			ifnull(
				(select max(episode) from videos where upload_date = v.upload_date),
				substr(upload_date, 6, 2) || substr(upload_date, 9, 2) || '00')
		from videos v where episode is null group by upload_date
	`

	// Loop over each year and set the missing episode numbers
	for row := range tx.Query(query).Range(&err) {
		var uploadDate string
		var lastEpisode int
		err = row.Scan(&uploadDate, &lastEpisode)
		log.Printf("Last episode for %s is %d", uploadDate, lastEpisode)
		if err != nil {
			return fmt.Errorf("error getting row: %w", err)
		}

		// Find all episodes that need updating
		query := tx.Query("select id from videos where upload_date = ? and episode is null order by run, id desc").Bind(uploadDate)

		// Update each episode
		for episode := range query.Range(&err) {
			var episodeId int
			err = episode.Scan(&episodeId)
			if err != nil {
				return fmt.Errorf("error retrieving episode id: %w", err)
			}

			// Set the episode ID
			log.Printf("Setting episode ID for %d to %d", episodeId, lastEpisode)
			lastEpisode++
			err = tx.Query("update videos set episode = ? where id = ?").Bind(lastEpisode, episodeId).Exec()
			if err != nil {
				return fmt.Errorf("error updating episode id: %w", err)
			}
		}
		if err != nil {
			return fmt.Errorf("error retrieving episodes: %w", err)
		}
	}
	if err != nil {
		return fmt.Errorf("error fetching episodes: %w", err)
	}

	// Commit all changes
	err = tx.Commit()
	if err != nil {
		return fmt.Errorf("error commiting changes: %w", err)
	}

	return nil
}