package files

import (
	"aunefyren/wrapperr/models"
	"encoding/json"
	"errors"
	"log"
	"os"
	"path/filepath"

	"github.com/google/uuid"
)

const wrapperr_version_parameter = "{{RELEASE_TAG}}"
const minSecretKeySize = 32

var config_path, _ = filepath.Abs("./config/config.json")
var default_config_path, _ = filepath.Abs("./files/configDefault.json")
var certPath, _ = filepath.Abs("./config/cert.pem")
var certKeyPath, _ = filepath.Abs("./config/key.pem")
var timezonesPath, _ = filepath.Abs("./files/timezones.json")

// Check if the config file has been configured for usage
func GetConfigState() (bool, error) {

	// Check if an admin is configured. Wrapperr must be claimed by an admin to function.
	admin, err := GetAdminState()
	if err != nil {
		log.Println("Get config state threw error trying to validate admin state.")
		return false, err
	} else if !admin {
		return false, nil
	}

	// Retrieve config object from function
	config, err := GetConfig()
	if err != nil {
		log.Println("Get config state threw error trying to retrieve config.")
		return false, err
	}

	// Check if certain parameters are set. These are essential parameters the user must configure for basic functionality.
	if config.TautulliConfig[0].TautulliApiKey != "" && config.TautulliConfig[0].TautulliIP != "" && config.TautulliConfig[0].TautulliLength != 0 && config.Timezone != "" && config.WrappedStart != 0 && config.WrappedEnd != 0 && config.WrapperrVersion != "" {
		return true, nil
	} else {
		return false, nil
	}
}

// Get private key from the config file
func GetPrivateKey() (string, error) {

	// Retrieve config object from function
	config, err := GetConfig()
	if err != nil {
		return "", err
	}

	// Get variable from env file
	var private_key = config.PrivateKey

	if len(config.PrivateKey) < minSecretKeySize {
		return "", errors.New("Invalid private key size in configuration file.")
	}

	// If private key is not empty, return it.
	// If empty create a new one, write to file, and return the new one
	if private_key != "" {
		return private_key, nil
	} else {
		NewPrivateKey, err := UpdatePrivateKey()
		if err != nil {
			return "", err
		} else {
			return NewPrivateKey, nil
		}
	}
}

// Update private key to random string
func UpdatePrivateKey() (string, error) {

	// Retrieve config object from function
	config, err := GetConfig()
	if err != nil {
		return "", err
	}

	// Get variable from env file
	config.PrivateKey = uuid.New().String()

	// Save new config
	err = SaveConfig(config)
	if err != nil {
		return "", err
	}

	// Return empty error
	return config.PrivateKey, nil
}

// Saves the given config struct as config.json
func SaveConfig(config models.WrapperrConfig) (err error) {
	err = nil

	file, err := json.MarshalIndent(config, "", "	")
	if err != nil {
		return err
	}

	err = os.WriteFile(config_path, file, 0644)
	if err != nil {
		return err
	}

	return nil
}

// Creates empty config.json
func CreateConfigFile() error {

	var config models.WrapperrConfig

	// Define default boolean values since they are harder to separate from deliberate boolean values
	config.UseCache = true
	config.PlexAuth = true
	config.UseLogs = true

	var tautulli_config = models.TautulliConfig{
		TautulliGrouping: true,
		TautulliPort:     80,
		TautulliLength:   5000,
	}
	config.TautulliConfig = append(config.TautulliConfig, tautulli_config)

	config.CreateShareLinks = true
	config.WinterTheme = true
	config.BasicAuth = false
	config.WrappedDynamic = false
	config.WrappedDynamicDays = 0
	config.WrapperrCustomize.StatsTopListLength = 10
	config.WrapperrCustomize.ObfuscateOtherUsers = true
	config.WrapperrCustomize.StatsOrderByDuration = true
	config.WrapperrCustomize.StatsOrderByPlays = true
	config.WrapperrCustomize.GetUserMovieStats = true
	config.WrapperrCustomize.GetUserShowStats = true
	config.WrapperrCustomize.GetUserShowBuddy = true
	config.WrapperrCustomize.GetUserMusicStats = true
	config.WrapperrCustomize.GetYearStatsMovies = true
	config.WrapperrCustomize.GetYearStatsShows = true
	config.WrapperrCustomize.GetYearStatsMusic = true
	config.WrapperrCustomize.GetYearStatsLeaderboard = true
	config.WrapperrCustomize.GetYearStatsLeaderboardNumbers = false

	err := SaveConfig(config)
	if err != nil {
		return err
	}

	return nil
}

// Read the config file and return the file as an object
func GetConfig() (config models.WrapperrConfig, err error) {
	config = models.WrapperrConfig{}
	err = nil

	// Create config.json if it doesn't exist
	if _, err := os.Stat(config_path); errors.Is(err, os.ErrNotExist) {
		log.Println("Config file does not exist. Creating.")

		err = CreateConfigFile()
		if err != nil {
			return config, err
		}
	}

	// Load config file
	file, err := os.ReadFile(config_path)
	if err != nil {
		return config, err
	}

	// Parse config file
	config = models.WrapperrConfig{}
	err = json.Unmarshal(file, &config)
	if err != nil {
		return config, err
	}
	if err != nil {

		// Parse config file
		log.Println("Failed to parse config file. Trying legacy format. Error: " + err.Error())
		// Load config file
		file, err = os.ReadFile(config_path)
		if err != nil {
			log.Fatal("Error when opening file: ", err)
		}

		config_legacy := models.WrapperrConfigLegacy{}
		err = json.Unmarshal(file, &config)

		convert_failed := false

		if err != nil {
			// Back up old config as legacy didn't work
			log.Println("Failed to parse config file as legacy. Replacing, but saving backup. Error: " + err.Error())
			convert_failed = true
		}

		if !convert_failed {
			// Attempt to convert Go struct
			config, err = ConvertLegacyToCurrentConfig(config, config_legacy)
			if err != nil {
				log.Println("Failed to convert config from legacy to modern. Replacing, but saving backup. Error: " + err.Error())
				convert_failed = true
			}
		}

		// if nothing worked, replace config file
		if convert_failed {
			log.Println("Get config file threw error trying to open the template file.")

			// Backup old config
			new_save_loc, err := BackUpConfig(config_path)
			if err != nil {
				log.Println("Failed to rename old config file.")
				return config, err
			} else {
				log.Println("Old config file saved to '" + new_save_loc + "'.")
			}

			// Load default config file
			file, err := os.ReadFile(default_config_path)
			if err != nil {
				log.Println("Get config file threw error trying to open the template file.")
				return config, err
			}

			// Parse default config file
			config = models.WrapperrConfig{}
			err = json.Unmarshal(file, &config)
			if err != nil {
				log.Println("Get config file threw error trying to parse the template file.")
				return config, err
			}
		}

	}

	// Load default config file
	file, err = os.ReadFile(default_config_path)
	if err != nil {
		log.Println("Get config file threw error trying to open the template file.")
		return config, err
	}

	// Parse default config file
	config_default := models.WrapperrConfig{}
	err = json.Unmarshal(file, &config_default)
	if err != nil {
		log.Println("Get config file threw error trying to parse the template file.")
		return config, err
	}

	// Update the Wrapperr version the config file is created for
	if config.WrapperrVersion != wrapperr_version_parameter {
		config.WrapperrVersion = wrapperr_version_parameter
	}

	// Create a new Client Key if there is none
	if config.ClientKey == "" {
		config.ClientKey = uuid.New().String()
	}

	// Create a new Private Key if there is none
	if config.PrivateKey == "" {
		config.PrivateKey = uuid.New().String()
	}

	// If there is no application name, set it to Wrapperr (defined in the default template)
	if config.ApplicationName == "" {
		config.ApplicationName = config_default.ApplicationName
	}

	// If there is no time zone, set it to Europe/Paris (defined in the default template)
	if config.Timezone == "" {
		config.Timezone = config_default.Timezone
	}

	// If there is no application name, set it to Wrapperr (defined in the default template)
	if config.WrapperrPort == 0 {
		config.WrapperrPort = config_default.WrapperrPort
	}

	// Set Wrapperr start time to jan if there is no time
	if config.WrappedStart == 0 {
		config.WrappedStart = config_default.WrappedStart
	}

	// Set Wrapperr end time to dec if there is no time
	if config.WrappedEnd == 0 {
		config.WrappedEnd = config_default.WrappedEnd // If no start time, set to 31 Dec
	}

	if config.TautulliConfig == nil || len(config.TautulliConfig) == 0 {

		log.Println("Tautulli server array is empty, adding a new one.")

		config.TautulliConfig = []models.TautulliConfig{}

		NewTautulliConfig := models.TautulliConfig{
			TautulliLength: config_default.TautulliConfig[0].TautulliLength,
			TautulliPort:   config_default.TautulliConfig[0].TautulliPort,
		}

		config.TautulliConfig = append(config.TautulliConfig, NewTautulliConfig)
	}

	// Set Tautulli length to 5000 if zero is set
	if config.TautulliConfig[0].TautulliLength == 0 {
		log.Println("Tautulli item length on server number 1 is 0, replacing with 5000.")
		config.TautulliConfig[0].TautulliLength = config_default.TautulliConfig[0].TautulliLength
	}

	// Set Tautulli port to 80 if zero is set
	if config.TautulliConfig[0].TautulliPort == 0 {
		log.Println("Tautulli port on server number 1 is 0, replacing with 80.")
		config.TautulliConfig[0].TautulliPort = config_default.TautulliConfig[0].TautulliPort
	}

	config, err = VerifyNonEmptyCustomValues(config, config_default)
	if err != nil {
		return config, err
	}

	// Save new version of config json
	err = SaveConfig(config)
	if err != nil {
		return config, err
	}

	// Return config object
	return config, nil
}

func BackUpConfig(ConfigPath string) (string, error) {
	new_save_loc := ConfigPath + "." + uuid.NewString() + ".replaced"
	err := os.Rename(config_path, new_save_loc)
	if err != nil {
		return "", err
	}
	return new_save_loc, nil
}

func ConvertLegacyToCurrentConfig(config models.WrapperrConfig, config_legacy models.WrapperrConfigLegacy) (models.WrapperrConfig, error) {

	var NewTautulli models.TautulliConfig

	NewTautulli.TautulliApiKey = config_legacy.TautulliConfig.TautulliApiKey
	NewTautulli.TautulliIP = config_legacy.TautulliConfig.TautulliIP
	NewTautulli.TautulliLibraries = config_legacy.TautulliConfig.TautulliLibraries
	NewTautulli.TautulliRoot = config_legacy.TautulliConfig.TautulliRoot
	NewTautulli.TautulliGrouping = config_legacy.TautulliConfig.TautulliGrouping
	NewTautulli.TautulliHttps = config_legacy.TautulliConfig.TautulliHttps
	NewTautulli.TautulliLength = config_legacy.TautulliConfig.TautulliLength
	NewTautulli.TautulliPort = config_legacy.TautulliConfig.TautulliPort

	NewTautulli.TautulliName = "Server 1"

	config.TautulliConfig = append(config.TautulliConfig, NewTautulli)

	config.WrapperrCustomize = config_legacy.WrapperrCustomize
	config.WrapperrVersion = config_legacy.WrapperrVersion
	config.Timezone = config_legacy.Timezone
	config.ApplicationName = config_legacy.ApplicationName
	config.ApplicationURL = config_legacy.ApplicationURL
	config.UseCache = config_legacy.UseCache
	config.UseLogs = config_legacy.UseLogs
	config.ClientKey = config_legacy.ClientKey
	config.WrapperrRoot = config_legacy.WrapperrRoot
	config.PrivateKey = config_legacy.PrivateKey
	config.CreateShareLinks = config_legacy.CreateShareLinks
	config.WrappedStart = config_legacy.WrappedStart
	config.WrappedEnd = config_legacy.WrappedEnd
	config.WrapperrPort = config_legacy.WrapperrPort
	config.PlexAuth = config_legacy.PlexAuth
	config.WinterTheme = config_legacy.WinterTheme

	log.Println("Config migrated.")

	return config, nil
}

// verify values and replace empty ones
func VerifyNonEmptyCustomValues(config models.WrapperrConfig, config_default models.WrapperrConfig) (models.WrapperrConfig, error) {

	if config.WrapperrCustomize.StatsTopListLength < 0 {
		config.WrapperrCustomize.StatsTopListLength = config_default.WrapperrCustomize.StatsTopListLength
	}

	if config.WrapperrCustomize.WrapperrFrontPageTitle == "" {
		config.WrapperrCustomize.WrapperrFrontPageTitle = config_default.WrapperrCustomize.WrapperrFrontPageTitle
	}

	if config.WrapperrCustomize.WrapperrFrontPageSubtitle == "" {
		config.WrapperrCustomize.WrapperrFrontPageSubtitle = config_default.WrapperrCustomize.WrapperrFrontPageSubtitle
	}

	if config.WrapperrCustomize.StatsIntroTitle == "" {
		config.WrapperrCustomize.StatsIntroTitle = config_default.WrapperrCustomize.StatsIntroTitle // If no intro title string, set to default intro title
	}

	if config.WrapperrCustomize.StatsIntroSubtitle == "" {
		config.WrapperrCustomize.StatsIntroSubtitle = config_default.WrapperrCustomize.StatsIntroSubtitle // If no intro subtitle string, set to default intro subtitle
	}

	if config.WrapperrCustomize.StatsOutroTitle == "" {
		config.WrapperrCustomize.StatsOutroTitle = config_default.WrapperrCustomize.StatsOutroTitle // If no outro title string, set to default outro title
	}

	if config.WrapperrCustomize.StatsOutroSubtitle == "" {
		config.WrapperrCustomize.StatsOutroSubtitle = config_default.WrapperrCustomize.StatsOutroSubtitle // If no outro subtitle string, set to default outro subtitle
	}

	if !config.WrapperrCustomize.StatsOrderByDuration && !config.WrapperrCustomize.StatsOrderByPlays {
		config.WrapperrCustomize.StatsOrderByDuration = true
	}

	if config.WrapperrCustomize.GetUserMovieStatsTitle == "" {
		config.WrapperrCustomize.GetUserMovieStatsTitle = config_default.WrapperrCustomize.GetUserMovieStatsTitle
	}

	if config.WrapperrCustomize.GetUserMovieStatsSubtitle == "" {
		config.WrapperrCustomize.GetUserMovieStatsSubtitle = config_default.WrapperrCustomize.GetUserMovieStatsSubtitle
	}

	if config.WrapperrCustomize.GetUserMovieStatsSubsubtitle == "" {
		config.WrapperrCustomize.GetUserMovieStatsSubsubtitle = config_default.WrapperrCustomize.GetUserMovieStatsSubsubtitle
	}

	if config.WrapperrCustomize.GetUserMovieStatsSubtitleOne == "" {
		config.WrapperrCustomize.GetUserMovieStatsSubtitleOne = config_default.WrapperrCustomize.GetUserMovieStatsSubtitleOne
	}

	if config.WrapperrCustomize.GetUserMovieStatsSubsubtitleOne == "" {
		config.WrapperrCustomize.GetUserMovieStatsSubsubtitleOne = config_default.WrapperrCustomize.GetUserMovieStatsSubsubtitleOne
	}

	if config.WrapperrCustomize.GetUserMovieStatsSubtitleNone == "" {
		config.WrapperrCustomize.GetUserMovieStatsSubtitleNone = config_default.WrapperrCustomize.GetUserMovieStatsSubtitleNone
	}

	if config.WrapperrCustomize.GetUserMovieStatsSubsubtitleNone == "" {
		config.WrapperrCustomize.GetUserMovieStatsSubsubtitleNone = config_default.WrapperrCustomize.GetUserMovieStatsSubsubtitleNone
	}

	if config.WrapperrCustomize.GetUserMovieStatsTopMovie == "" {
		config.WrapperrCustomize.GetUserMovieStatsTopMovie = config_default.WrapperrCustomize.GetUserMovieStatsTopMovie
	}

	if config.WrapperrCustomize.GetUserMovieStatsTopMoviePlural == "" {
		config.WrapperrCustomize.GetUserMovieStatsTopMoviePlural = config_default.WrapperrCustomize.GetUserMovieStatsTopMoviePlural
	}

	if config.WrapperrCustomize.GetUserMovieStatsMovieCompletionTitle == "" {
		config.WrapperrCustomize.GetUserMovieStatsMovieCompletionTitle = config_default.WrapperrCustomize.GetUserMovieStatsMovieCompletionTitle
	}

	if config.WrapperrCustomize.GetUserMovieStatsMovieCompletionTitlePlural == "" {
		config.WrapperrCustomize.GetUserMovieStatsMovieCompletionTitlePlural = config_default.WrapperrCustomize.GetUserMovieStatsMovieCompletionTitlePlural
	}

	if config.WrapperrCustomize.GetUserMovieStatsMovieCompletionSubtitle == "" {
		config.WrapperrCustomize.GetUserMovieStatsMovieCompletionSubtitle = config_default.WrapperrCustomize.GetUserMovieStatsMovieCompletionSubtitle
	}

	if config.WrapperrCustomize.GetUserMovieStatsPauseTitle == "" {
		config.WrapperrCustomize.GetUserMovieStatsPauseTitle = config_default.WrapperrCustomize.GetUserMovieStatsPauseTitle
	}

	if config.WrapperrCustomize.GetUserMovieStatsPauseSubtitle == "" {
		config.WrapperrCustomize.GetUserMovieStatsPauseSubtitle = config_default.WrapperrCustomize.GetUserMovieStatsPauseSubtitle
	}

	if config.WrapperrCustomize.GetUserMovieStatsPauseTitleOne == "" {
		config.WrapperrCustomize.GetUserMovieStatsPauseTitleOne = config_default.WrapperrCustomize.GetUserMovieStatsPauseTitleOne
	}

	if config.WrapperrCustomize.GetUserMovieStatsPauseSubtitleOne == "" {
		config.WrapperrCustomize.GetUserMovieStatsPauseSubtitleOne = config_default.WrapperrCustomize.GetUserMovieStatsPauseSubtitleOne
	}

	if config.WrapperrCustomize.GetUserMovieStatsPauseTitleNone == "" {
		config.WrapperrCustomize.GetUserMovieStatsPauseTitleNone = config_default.WrapperrCustomize.GetUserMovieStatsPauseTitleNone
	}

	if config.WrapperrCustomize.GetUserMovieStatsPauseSubtitleNone == "" {
		config.WrapperrCustomize.GetUserMovieStatsPauseSubtitleNone = config_default.WrapperrCustomize.GetUserMovieStatsPauseSubtitleNone
	}

	if config.WrapperrCustomize.GetUserMovieStatsOldestTitle == "" {
		config.WrapperrCustomize.GetUserMovieStatsOldestTitle = config_default.WrapperrCustomize.GetUserMovieStatsOldestTitle
	}

	if config.WrapperrCustomize.GetUserMovieStatsOldestSubtitle == "" {
		config.WrapperrCustomize.GetUserMovieStatsOldestSubtitle = config_default.WrapperrCustomize.GetUserMovieStatsOldestSubtitle
	}

	if config.WrapperrCustomize.GetUserMovieStatsOldestSubtitlePre1950 == "" {
		config.WrapperrCustomize.GetUserMovieStatsOldestSubtitlePre1950 = config_default.WrapperrCustomize.GetUserMovieStatsOldestSubtitlePre1950
	}

	if config.WrapperrCustomize.GetUserMovieStatsOldestSubtitlePre1975 == "" {
		config.WrapperrCustomize.GetUserMovieStatsOldestSubtitlePre1975 = config_default.WrapperrCustomize.GetUserMovieStatsOldestSubtitlePre1975
	}

	if config.WrapperrCustomize.GetUserMovieStatsOldestSubtitlePre2000 == "" {
		config.WrapperrCustomize.GetUserMovieStatsOldestSubtitlePre2000 = config_default.WrapperrCustomize.GetUserMovieStatsOldestSubtitlePre2000
	}

	if config.WrapperrCustomize.GetUserMovieStatsSpentTitle == "" {
		config.WrapperrCustomize.GetUserMovieStatsSpentTitle = config_default.WrapperrCustomize.GetUserMovieStatsSpentTitle
	}

	if config.WrapperrCustomize.GetUserShowStatsTitle == "" {
		config.WrapperrCustomize.GetUserShowStatsTitle = config_default.WrapperrCustomize.GetUserShowStatsTitle
	}

	if config.WrapperrCustomize.GetUserShowStatsSubtitle == "" {
		config.WrapperrCustomize.GetUserShowStatsSubtitle = config_default.WrapperrCustomize.GetUserShowStatsSubtitle
	}

	if config.WrapperrCustomize.GetUserShowStatsSubsubtitle == "" {
		config.WrapperrCustomize.GetUserShowStatsSubsubtitle = config_default.WrapperrCustomize.GetUserShowStatsSubsubtitle
	}

	if config.WrapperrCustomize.GetUserShowStatsSubtitleOne == "" {
		config.WrapperrCustomize.GetUserShowStatsSubtitleOne = config_default.WrapperrCustomize.GetUserShowStatsSubtitleOne
	}

	if config.WrapperrCustomize.GetUserShowStatsSubsubtitleOne == "" {
		config.WrapperrCustomize.GetUserShowStatsSubsubtitleOne = config_default.WrapperrCustomize.GetUserShowStatsSubsubtitleOne
	}

	if config.WrapperrCustomize.GetUserShowStatsSubtitleNone == "" {
		config.WrapperrCustomize.GetUserShowStatsSubtitleNone = config_default.WrapperrCustomize.GetUserShowStatsSubtitleNone
	}

	if config.WrapperrCustomize.GetUserShowStatsSubsubtitleNone == "" {
		config.WrapperrCustomize.GetUserShowStatsSubsubtitleNone = config_default.WrapperrCustomize.GetUserShowStatsSubsubtitleNone
	}

	if config.WrapperrCustomize.GetUserShowStatsTopShow == "" {
		config.WrapperrCustomize.GetUserShowStatsTopShow = config_default.WrapperrCustomize.GetUserShowStatsTopShow
	}

	if config.WrapperrCustomize.GetUserShowStatsTopShowPlural == "" {
		config.WrapperrCustomize.GetUserShowStatsTopShowPlural = config_default.WrapperrCustomize.GetUserShowStatsTopShowPlural
	}

	if config.WrapperrCustomize.GetUserShowStatsSpentTitle == "" {
		config.WrapperrCustomize.GetUserShowStatsSpentTitle = config_default.WrapperrCustomize.GetUserShowStatsSpentTitle
	}

	if config.WrapperrCustomize.GetUserShowStatsMostPlayedTitle == "" {
		config.WrapperrCustomize.GetUserShowStatsMostPlayedTitle = config_default.WrapperrCustomize.GetUserShowStatsMostPlayedTitle
	}

	if config.WrapperrCustomize.GetUserShowStatsMostPlayedSubtitle == "" {
		config.WrapperrCustomize.GetUserShowStatsMostPlayedSubtitle = config_default.WrapperrCustomize.GetUserShowStatsMostPlayedSubtitle
	}

	if config.WrapperrCustomize.GetUserShowStatsBuddyTitle == "" {
		config.WrapperrCustomize.GetUserShowStatsBuddyTitle = config_default.WrapperrCustomize.GetUserShowStatsBuddyTitle
	}

	if config.WrapperrCustomize.GetUserShowStatsBuddySubtitle == "" {
		config.WrapperrCustomize.GetUserShowStatsBuddySubtitle = config_default.WrapperrCustomize.GetUserShowStatsBuddySubtitle
	}

	if config.WrapperrCustomize.GetUserShowStatsBuddyTitleNone == "" {
		config.WrapperrCustomize.GetUserShowStatsBuddyTitleNone = config_default.WrapperrCustomize.GetUserShowStatsBuddyTitleNone
	}

	if config.WrapperrCustomize.GetUserShowStatsBuddySubtitleNone == "" {
		config.WrapperrCustomize.GetUserShowStatsBuddySubtitleNone = config_default.WrapperrCustomize.GetUserShowStatsBuddySubtitleNone
	}

	if config.WrapperrCustomize.GetUserMusicStatsTitle == "" {
		config.WrapperrCustomize.GetUserMusicStatsTitle = config_default.WrapperrCustomize.GetUserMusicStatsTitle
	}

	if config.WrapperrCustomize.GetUserMusicStatsSubtitle == "" {
		config.WrapperrCustomize.GetUserMusicStatsSubtitle = config_default.WrapperrCustomize.GetUserMusicStatsSubtitle
	}

	if config.WrapperrCustomize.GetUserMusicStatsSubsubtitle == "" {
		config.WrapperrCustomize.GetUserMusicStatsSubsubtitle = config_default.WrapperrCustomize.GetUserMusicStatsSubsubtitle
	}

	if config.WrapperrCustomize.GetUserMusicStatsSubtitleOne == "" {
		config.WrapperrCustomize.GetUserMusicStatsSubtitleOne = config_default.WrapperrCustomize.GetUserMusicStatsSubtitleOne
	}

	if config.WrapperrCustomize.GetUserMusicStatsSubsubtitleOne == "" {
		config.WrapperrCustomize.GetUserMusicStatsSubsubtitleOne = config_default.WrapperrCustomize.GetUserMusicStatsSubsubtitleOne
	}

	if config.WrapperrCustomize.GetUserMusicStatsSubtitleNone == "" {
		config.WrapperrCustomize.GetUserMusicStatsSubtitleNone = config_default.WrapperrCustomize.GetUserMusicStatsSubtitleNone
	}

	if config.WrapperrCustomize.GetUserMusicStatsSubsubtitleNone == "" {
		config.WrapperrCustomize.GetUserMusicStatsSubsubtitleNone = config_default.WrapperrCustomize.GetUserMusicStatsSubsubtitleNone
	}

	if config.WrapperrCustomize.GetUserMusicStatsTopTrack == "" {
		config.WrapperrCustomize.GetUserMusicStatsTopTrack = config_default.WrapperrCustomize.GetUserMusicStatsTopTrack
	}

	if config.WrapperrCustomize.GetUserMusicStatsTopTrackPlural == "" {
		config.WrapperrCustomize.GetUserMusicStatsTopTrackPlural = config_default.WrapperrCustomize.GetUserMusicStatsTopTrackPlural
	}

	if config.WrapperrCustomize.GetUserMusicStatsTopAlbumPlural == "" {
		config.WrapperrCustomize.GetUserMusicStatsTopAlbumPlural = config_default.WrapperrCustomize.GetUserMusicStatsTopAlbumPlural
	}

	if config.WrapperrCustomize.GetUserMusicStatsTopArtistPlural == "" {
		config.WrapperrCustomize.GetUserMusicStatsTopArtistPlural = config_default.WrapperrCustomize.GetUserMusicStatsTopArtistPlural
	}

	if config.WrapperrCustomize.GetUserMusicStatsSpentTitle == "" {
		config.WrapperrCustomize.GetUserMusicStatsSpentTitle = config_default.WrapperrCustomize.GetUserMusicStatsSpentTitle
	}

	if config.WrapperrCustomize.GetUserMusicStatsSpentSubtitle == "" {
		config.WrapperrCustomize.GetUserMusicStatsSpentSubtitle = config_default.WrapperrCustomize.GetUserMusicStatsSpentSubtitle
	}

	if config.WrapperrCustomize.GetUserMusicStatsOldestAlbumTitle == "" {
		config.WrapperrCustomize.GetUserMusicStatsOldestAlbumTitle = config_default.WrapperrCustomize.GetUserMusicStatsOldestAlbumTitle
	}

	if config.WrapperrCustomize.GetUserMusicStatsOldestAlbumSubtitle == "" {
		config.WrapperrCustomize.GetUserMusicStatsOldestAlbumSubtitle = config_default.WrapperrCustomize.GetUserMusicStatsOldestAlbumSubtitle
	}

	if config.WrapperrCustomize.GetYearStatsTitle == "" {
		config.WrapperrCustomize.GetYearStatsTitle = config_default.WrapperrCustomize.GetYearStatsTitle
	}

	if config.WrapperrCustomize.GetYearStatsSubtitle == "" {
		config.WrapperrCustomize.GetYearStatsSubtitle = config_default.WrapperrCustomize.GetYearStatsSubtitle
	}

	if config.WrapperrCustomize.GetYearStatsSubsubtitle == "" {
		config.WrapperrCustomize.GetYearStatsSubsubtitle = config_default.WrapperrCustomize.GetYearStatsSubsubtitle
	}

	if config.WrapperrCustomize.GetYearStatsMoviesTitle == "" {
		config.WrapperrCustomize.GetYearStatsMoviesTitle = config_default.WrapperrCustomize.GetYearStatsMoviesTitle
	}

	if config.WrapperrCustomize.GetYearStatsShowsTitle == "" {
		config.WrapperrCustomize.GetYearStatsShowsTitle = config_default.WrapperrCustomize.GetYearStatsShowsTitle
	}

	if config.WrapperrCustomize.GetYearStatsMusicTitle == "" {
		config.WrapperrCustomize.GetYearStatsMusicTitle = config_default.WrapperrCustomize.GetYearStatsMusicTitle
	}

	if config.WrapperrCustomize.GetYearStatsLeaderboardTitle == "" {
		config.WrapperrCustomize.GetYearStatsLeaderboardTitle = config_default.WrapperrCustomize.GetYearStatsLeaderboardTitle
	}

	if config.WrapperrCustomize.GetYearStatsMoviesDurationTitle == "" {
		config.WrapperrCustomize.GetYearStatsMoviesDurationTitle = config_default.WrapperrCustomize.GetYearStatsMoviesDurationTitle
	}

	if config.WrapperrCustomize.GetYearStatsShowsDurationTitle == "" {
		config.WrapperrCustomize.GetYearStatsShowsDurationTitle = config_default.WrapperrCustomize.GetYearStatsShowsDurationTitle
	}

	if config.WrapperrCustomize.GetYearStatsMusicDurationTitle == "" {
		config.WrapperrCustomize.GetYearStatsMusicDurationTitle = config_default.WrapperrCustomize.GetYearStatsMusicDurationTitle
	}

	if config.WrapperrCustomize.GetYearStatsDurationSumTitle == "" {
		config.WrapperrCustomize.GetYearStatsDurationSumTitle = config_default.WrapperrCustomize.GetYearStatsDurationSumTitle
	}

	if config.WrapperrCustomize.WrapperrAnd == "" {
		config.WrapperrCustomize.WrapperrAnd = config_default.WrapperrCustomize.WrapperrAnd
	}

	if config.WrapperrCustomize.WrapperrPlay == "" {
		config.WrapperrCustomize.WrapperrPlay = config_default.WrapperrCustomize.WrapperrPlay
	}

	if config.WrapperrCustomize.WrapperrPlayPlural == "" {
		config.WrapperrCustomize.WrapperrPlayPlural = config_default.WrapperrCustomize.WrapperrPlayPlural
	}

	if config.WrapperrCustomize.WrapperrDay == "" {
		config.WrapperrCustomize.WrapperrDay = config_default.WrapperrCustomize.WrapperrDay
	}

	if config.WrapperrCustomize.WrapperrDayPlural == "" {
		config.WrapperrCustomize.WrapperrDayPlural = config_default.WrapperrCustomize.WrapperrDayPlural
	}

	if config.WrapperrCustomize.WrapperrHour == "" {
		config.WrapperrCustomize.WrapperrHour = config_default.WrapperrCustomize.WrapperrHour
	}

	if config.WrapperrCustomize.WrapperrHourPlural == "" {
		config.WrapperrCustomize.WrapperrHourPlural = config_default.WrapperrCustomize.WrapperrHourPlural
	}

	if config.WrapperrCustomize.WrapperrMinute == "" {
		config.WrapperrCustomize.WrapperrMinute = config_default.WrapperrCustomize.WrapperrMinute
	}

	if config.WrapperrCustomize.WrapperrMinutePlural == "" {
		config.WrapperrCustomize.WrapperrMinutePlural = config_default.WrapperrCustomize.WrapperrMinutePlural
	}

	if config.WrapperrCustomize.WrapperrSecond == "" {
		config.WrapperrCustomize.WrapperrSecond = config_default.WrapperrCustomize.WrapperrSecond
	}

	if config.WrapperrCustomize.WrapperrSecondPlural == "" {
		config.WrapperrCustomize.WrapperrSecondPlural = config_default.WrapperrCustomize.WrapperrSecondPlural
	}

	if config.WrapperrCustomize.WrapperrSortPlays == "" {
		config.WrapperrCustomize.WrapperrSortPlays = config_default.WrapperrCustomize.WrapperrSortPlays
	}

	if config.WrapperrCustomize.WrapperrSortDuration == "" {
		config.WrapperrCustomize.WrapperrSortDuration = config_default.WrapperrCustomize.WrapperrSortDuration
	}

	return config, nil

}

func GetCertPaths() (string, string) {
	return certPath, certKeyPath
}

// Get private key from the config file
func CheckCertFiles() (certFound bool) {
	certFound = false

	// Create config.json if it doesn't exist
	if _, err := os.Stat(certPath); errors.Is(err, os.ErrNotExist) {
		return
	}

	if _, err := os.Stat(certKeyPath); errors.Is(err, os.ErrNotExist) {
		return
	}

	certFound = true
	return
}

func GetTimezones() (timezones models.Timezones, err error) {
	timezones = models.Timezones{}
	err = nil

	// Load config file
	file, err := os.ReadFile(timezonesPath)
	if err != nil {
		return timezones, err
	}

	// Parse config file
	err = json.Unmarshal(file, &timezones)
	if err != nil {
		return timezones, err
	}

	return
}
