package fic

import (
	"fmt"
	"path"
	"strings"
)

var GlobalScoreCoefficient float64 = 1

// exportedExercice is a structure representing a challenge, as exposed to players.
type exportedExercice struct {
	Id       int64    `json:"id"`
	Title    string   `json:"title"`
	Authors  string   `json:"authors,omitempty"`
	Headline string   `json:"headline,omitempty"`
	Image    string   `json:"image,omitempty"`
	URLId    string   `json:"urlid"`
	Tags     []string `json:"tags"`
	Gain     int64    `json:"gain"`
	Coeff    float64  `json:"curcoeff"`
	Solved   int64    `json:"solved"`
	Tried    int64    `json:"tried"`
}

// exportedTheme is a structure representing a Theme, as exposed to players.
type exportedTheme struct {
	Name         string             `json:"name"`
	URLId        string             `json:"urlid"`
	Locked       bool               `json:"locked,omitempty"`
	Authors      string             `json:"authors"`
	Headline     string             `json:"headline,omitempty"`
	Intro        string             `json:"intro"`
	Image        string             `json:"image,omitempty"`
	PartnerImage string             `json:"partner_img,omitempty"`
	PartnerLink  string             `json:"partner_href,omitempty"`
	PartnerText  string             `json:"partner_txt,omitempty"`
	Exercices    []exportedExercice `json:"exercices"`
}

// Exportedthemes exports themes from the database, to be displayed to players.
func ExportThemes() (interface{}, error) {
	if themes, err := GetThemes(); err != nil {
		return nil, err
	} else {
		ret := map[string]exportedTheme{}
		for _, theme := range themes {
			exos := []exportedExercice{}

			if exercices, err := theme.GetExercices(); err != nil {
				return nil, err
			} else {
				for _, exercice := range exercices {
					if exercice.Disabled && theme.Locked {
						continue
					}

					exoimgpath := ""
					if len(exercice.Image) > 0 {
						exoimgpath = path.Join(FilesDir, exercice.Image)
					}

					tags, _ := exercice.GetTags()
					exos = append(exos, exportedExercice{
						exercice.Id,
						exercice.Title,
						exercice.Authors,
						exercice.Headline,
						exoimgpath,
						exercice.URLId,
						tags,
						int64(float64(exercice.Gain) * GlobalScoreCoefficient),
						exercice.Coefficient,
						exercice.SolvedCount(),
						exercice.TriedTeamCount(),
					})
				}
			}

			imgpath := ""
			if len(theme.Image) > 0 {
				imgpath = path.Join(FilesDir, theme.Image)
			}

			partnerImgpath := ""
			if len(theme.PartnerImage) > 0 {
				partnerImgpath = path.Join(FilesDir, theme.PartnerImage)
			}

			ret[fmt.Sprintf("%d", theme.Id)] = exportedTheme{
				theme.Name,
				theme.URLId,
				theme.Locked,
				theme.Authors,
				theme.Headline,
				strings.Replace(theme.Intro, "$FILES$", FilesDir, -1),
				imgpath,
				partnerImgpath,
				theme.PartnerLink,
				theme.PartnerText,
				exos,
			}
		}

		return ret, nil
	}
}
