package common

import (
	"fmt"
)

type CustomizationColor string

const (
	CustomizationColorPrimary   CustomizationColor = "primary"
	CustomizationColorPurple    CustomizationColor = "purple"
	CustomizationColorIndigo    CustomizationColor = "indigo"
	CustomizationColorTurquoise CustomizationColor = "turquoise"
	CustomizationColorBlue      CustomizationColor = "blue"
	CustomizationColorGreen     CustomizationColor = "green"
	CustomizationColorYellow    CustomizationColor = "yellow"
	CustomizationColorOrange    CustomizationColor = "orange"
	CustomizationColorRed       CustomizationColor = "red"
	CustomizationColorFlamingo  CustomizationColor = "flamingo"
	CustomizationColorBrown     CustomizationColor = "brown"
	CustomizationColorSky       CustomizationColor = "sky"
	CustomizationColorArmy      CustomizationColor = "army"
	CustomizationColorMagenta   CustomizationColor = "magenta"
	CustomizationColorCopper    CustomizationColor = "copper"
	CustomizationColorCamel     CustomizationColor = "camel"
	CustomizationColorYinYang   CustomizationColor = "yinyang"
	CustomizationColorBeige     CustomizationColor = "beige"
)

var colorToIDMap = map[CustomizationColor]uint32{
	CustomizationColorPrimary:   0,
	CustomizationColorPurple:    1,
	CustomizationColorIndigo:    2,
	CustomizationColorTurquoise: 3,
	CustomizationColorBlue:      4,
	CustomizationColorGreen:     5,
	CustomizationColorYellow:    6,
	CustomizationColorOrange:    7,
	CustomizationColorRed:       8,
	CustomizationColorFlamingo:  9,
	CustomizationColorBrown:     10,
	CustomizationColorSky:       11,
	CustomizationColorArmy:      12,
	CustomizationColorMagenta:   13,
	CustomizationColorCopper:    14,
	CustomizationColorCamel:     15,
	CustomizationColorYinYang:   16,
	CustomizationColorBeige:     17,
}

func ColorToID(color CustomizationColor) (uint32, error) {
	id, ok := colorToIDMap[color]
	if !ok {
		return 0, fmt.Errorf("Invalid color: %s", color)
	}
	return id, nil
}

func IDToColor(id uint32) (CustomizationColor, error) {
	for color, colorID := range colorToIDMap {
		if colorID == id {
			return color, nil
		}
	}
	return "", fmt.Errorf("Invalid color id: %d", id)
}

func ColorToIDFallbackToBlue(color CustomizationColor) uint32 {
	id, err := ColorToID(color)
	if err != nil {
		return 4
	}
	return id
}

func IDToColorFallbackToBlue(id uint32) CustomizationColor {
	color, err := IDToColor(id)
	if err != nil {
		return CustomizationColorBlue
	}

	return color
}