package main

import (
	"fmt"
	"math"
	"sort"

	"github.com/confusedpolarbear/intro_skipper_verifier/structs"
)

// report template helper functions

// Sort show names alphabetically
func templateSortShows(shows map[string]structs.Seasons) []string {
	var showNames []string

	for show := range shows {
		showNames = append(showNames, show)
	}

	sort.Strings(showNames)

	return showNames
}

// Sort season numbers
func templateSortSeason(show structs.Seasons) []int {
	var keys []int

	for season := range show {
		keys = append(keys, season)
	}

	sort.Ints(keys)

	return keys
}

// Compare the episode with the provided ID in the old report to the episode in the new report.
func templateCompareEpisodes(id string, reports structs.TemplateReportData) structs.IntroPair {
	var pair structs.IntroPair
	var tolerance int = 5

	// Locate both episodes
	pair.Old = reports.OldReport.IntroMap[id]
	pair.New = reports.NewReport.IntroMap[id]

	// Mark the timestamps as similar if they are within a few seconds of each other
	similar := func(oldTime, newTime float32) bool {
		diff := math.Abs(float64(newTime) - float64(oldTime))
		return diff <= float64(tolerance)
	}

	if pair.Old.Valid && !pair.New.Valid {
		// If an intro was found previously, but not now, flag it
		pair.WarningShort = "only_previous"
		pair.Warning = "Introduction found in previous report, but not the current one"

	} else if !pair.Old.Valid && pair.New.Valid {
		// If an intro was not found previously, but found now, flag it
		pair.WarningShort = "improvement"
		pair.Warning = "New introduction discovered"

	} else if !pair.Old.Valid && !pair.New.Valid {
		// If an intro has never been found for this episode
		pair.WarningShort = "missing"
		pair.Warning = "No introduction has ever been found for this episode"

	} else if !similar(pair.Old.IntroStart, pair.New.IntroStart) || !similar(pair.Old.IntroEnd, pair.New.IntroEnd) {
		// If the intro timestamps are too different, flag it
		pair.WarningShort = "different"
		pair.Warning = fmt.Sprintf("Timestamps differ by more than %d seconds", tolerance)

	} else {
		// No warning was generated
		pair.WarningShort = "okay"
		pair.Warning = "Okay"
	}

	return pair
}