// +build ignore

package main

import (
	"encoding/json"
	"flag"
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"regexp"
	"strings"
)

func main() {
	var toGoMap bool
	flag.BoolVar(&toGoMap, "g", false, "Set if you want to export data to mappings.go")
	flag.Parse()

	semantic, err := getMappings("https://raw.githubusercontent.com/Semantic-Org/Semantic-UI/master/src/themes/default/elements/icon.overrides", semanticRegex)
	if err != nil {
		panic(err)
	}
	fontawesome, err := getMappings("https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.css", fontAwesomeRegex)
	if err != nil {
		panic(err)
	}
	classMappings := make(map[string]string, len(semantic))
	for k, v := range semantic {
		if equivalent, ok := fontawesome[k]; ok {
			classMappings[equivalent] = v
		}
	}
	b, err := json.MarshalIndent(classMappings, "", "\t")
	if err != nil {
		panic(err)
	}

	if toGoMap {
		f, err := os.Create("modules/fa-semantic-mappings/mappings.go")
		defer f.Close()
		if err != nil {
			panic(err)
		}
		f.Write([]byte(fileHeader))
		fmt.Fprintf(f, "var Mappings = %#v\n", classMappings)
		fmt.Println("generate: mappings.go")
	} else {
		fmt.Println(string(b))
	}
}

const fileHeader = `// THIS FILE WAS AUTOMATICALLY GENERATED BY A TOOL
// Use ` + "`go generate`" + ` to generate this.

package fasuimappings

// Mappings is a map containing the Semantic UI icon equivalent of FontAwesome
// icons. 
`

var semanticRegex = regexp.MustCompile(`i\.([\.a-zA-Z0-9-]+):before { content: "(.{5})"; }`)
var fontAwesomeRegex = regexp.MustCompile(`.([a-zA-Z0-9-]+):before {
  content: "(.{5})";
}`)

func getMappings(url string, regex *regexp.Regexp) (map[string]string, error) {
	ov, err := http.Get(url)
	if err != nil {
		return nil, err
	}
	b, err := ioutil.ReadAll(ov.Body)
	if err != nil {
		return nil, err
	}
	strs := regex.FindAllStringSubmatch(string(b), -1)
	m := make(map[string]string, len(strs))
	for _, strs := range strs {
		m[strs[2]] = strings.Replace(strs[1], ".", " ", -1)
	}
	return m, nil
}
