package model

import (
    "html/template"
    "strings"
    "time"
)

type (
    ReleaseType string

    Release struct {
        ID              string      `json:"id"`
        Visible         bool        `json:"visible"`
        Title           string      `json:"title"`
        Description     string      `json:"description"`
        ReleaseType     ReleaseType `json:"type" db:"type"`
        ReleaseDate     time.Time   `json:"releaseDate" db:"release_date"`
        Artwork         string      `json:"artwork"`
        Buyname         string      `json:"buyname"`
        Buylink         string      `json:"buylink"`
        Copyright       string      `json:"copyright" db:"copyright"`
        CopyrightURL    string      `json:"copyrightURL" db:"copyrighturl"`
        Tracks          []*Track    `json:"tracks"`
        Credits         []*Credit   `json:"credits"`
        Links           []*Link     `json:"links"`
        CreatedAt       time.Time   `json:"-" db:"created_at"`
    }
)

const (
    Single      ReleaseType = "single"
    Album       ReleaseType = "album"
    EP          ReleaseType = "EP"
    Compilation ReleaseType = "compilation"
    Upcoming    ReleaseType = "upcoming"
)

// GETTERS

func (release Release) GetDescriptionHTML() template.HTML {
    return template.HTML(strings.Replace(release.Description, "\n", "<br>", -1))
}

func (release Release) TextReleaseDate() string {
    return release.ReleaseDate.Format("2006-01-02T15:04")
}

func (release Release) PrintReleaseDate() string {
    return release.ReleaseDate.Format("02 January 2006")
}

func (release Release) GetArtwork() string {
    if release.Artwork == "" {
        return "/img/default-cover-art.png"
    }
    return release.Artwork
}

func (release Release) IsSingle() bool {
    return len(release.Tracks) == 1;
}

func (release Release) IsReleased() bool {
    return release.ReleaseDate.Before(time.Now())
}

func (release Release) GetUniqueArtistNames(only_primary bool) []string {
    names := []string{}

    for _, credit := range release.Credits {
        if only_primary && !credit.Primary { continue }
        names = append(names, credit.Artist.Name)
    }

    return names
}

func (release Release) PrintArtists(only_primary bool, ampersand bool) string {
    names := release.GetUniqueArtistNames(only_primary)

    if len(names) == 0 {
        return "Unknown Artist"
    } else if len(names) == 1 {
        return names[0]
    }

    if ampersand {
        res := strings.Join(names[:len(names)-1], ", ")
        res += " & " + names[len(names)-1]
        return res
    } else {
        return strings.Join(names[:], ", ")
    }
}
