// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build ignore
// +build ignore

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"log"
	"strings"

	"golang.org/x/text/internal/gen"
)

type group struct {
	Encodings []struct {
		Labels []string
		Name   string
	}
}

func main() {
	gen.Init()

	r := gen.Open("https://encoding.spec.whatwg.org", "whatwg", "encodings.json")
	var groups []group
	if err := json.NewDecoder(r).Decode(&groups); err != nil {
		log.Fatalf("Error reading encodings.json: %v", err)
	}

	w := &bytes.Buffer{}
	fmt.Fprintln(w, "type htmlEncoding byte")
	fmt.Fprintln(w, "const (")
	for i, g := range groups {
		for _, e := range g.Encodings {
			key := strings.ToLower(e.Name)
			name := consts[key]
			if name == "" {
				log.Fatalf("No const defined for %s.", key)
			}
			if i == 0 {
				fmt.Fprintf(w, "%s htmlEncoding = iota\n", name)
			} else {
				fmt.Fprintf(w, "%s\n", name)
			}
		}
	}
	fmt.Fprintln(w, "numEncodings")
	fmt.Fprint(w, ")\n\n")

	fmt.Fprintln(w, "var canonical = [numEncodings]string{")
	for _, g := range groups {
		for _, e := range g.Encodings {
			fmt.Fprintf(w, "%q,\n", strings.ToLower(e.Name))
		}
	}
	fmt.Fprint(w, "}\n\n")

	fmt.Fprintln(w, "var nameMap = map[string]htmlEncoding{")
	for _, g := range groups {
		for _, e := range g.Encodings {
			for _, l := range e.Labels {
				key := strings.ToLower(e.Name)
				name := consts[key]
				fmt.Fprintf(w, "%q: %s,\n", l, name)
			}
		}
	}
	fmt.Fprint(w, "}\n\n")

	var tags []string
	fmt.Fprintln(w, "var localeMap = []htmlEncoding{")
	for _, loc := range locales {
		tags = append(tags, loc.tag)
		fmt.Fprintf(w, "%s, // %s \n", consts[loc.name], loc.tag)
	}
	fmt.Fprint(w, "}\n\n")

	fmt.Fprintf(w, "const locales = %q\n", strings.Join(tags, " "))

	gen.WriteGoFile("tables.go", "htmlindex", w.Bytes())
}

// consts maps canonical encoding name to internal constant.
var consts = map[string]string{
	"utf-8":          "utf8",
	"ibm866":         "ibm866",
	"iso-8859-2":     "iso8859_2",
	"iso-8859-3":     "iso8859_3",
	"iso-8859-4":     "iso8859_4",
	"iso-8859-5":     "iso8859_5",
	"iso-8859-6":     "iso8859_6",
	"iso-8859-7":     "iso8859_7",
	"iso-8859-8":     "iso8859_8",
	"iso-8859-8-i":   "iso8859_8I",
	"iso-8859-10":    "iso8859_10",
	"iso-8859-13":    "iso8859_13",
	"iso-8859-14":    "iso8859_14",
	"iso-8859-15":    "iso8859_15",
	"iso-8859-16":    "iso8859_16",
	"koi8-r":         "koi8r",
	"koi8-u":         "koi8u",
	"macintosh":      "macintosh",
	"windows-874":    "windows874",
	"windows-1250":   "windows1250",
	"windows-1251":   "windows1251",
	"windows-1252":   "windows1252",
	"windows-1253":   "windows1253",
	"windows-1254":   "windows1254",
	"windows-1255":   "windows1255",
	"windows-1256":   "windows1256",
	"windows-1257":   "windows1257",
	"windows-1258":   "windows1258",
	"x-mac-cyrillic": "macintoshCyrillic",
	"gbk":            "gbk",
	"gb18030":        "gb18030",
	// "hz-gb-2312":     "hzgb2312", // Was removed from WhatWG
	"big5":           "big5",
	"euc-jp":         "eucjp",
	"iso-2022-jp":    "iso2022jp",
	"shift_jis":      "shiftJIS",
	"euc-kr":         "euckr",
	"replacement":    "replacement",
	"utf-16be":       "utf16be",
	"utf-16le":       "utf16le",
	"x-user-defined": "xUserDefined",
}

// locales is taken from
// https://html.spec.whatwg.org/multipage/syntax.html#encoding-sniffing-algorithm.
var locales = []struct{ tag, name string }{
	// The default value. Explicitly state latin to benefit from the exact
	// script option, while still making 1252 the default encoding for languages
	// written in Latin script.
	{"und_Latn", "windows-1252"},
	{"ar", "windows-1256"},
	{"ba", "windows-1251"},
	{"be", "windows-1251"},
	{"bg", "windows-1251"},
	{"cs", "windows-1250"},
	{"el", "iso-8859-7"},
	{"et", "windows-1257"},
	{"fa", "windows-1256"},
	{"he", "windows-1255"},
	{"hr", "windows-1250"},
	{"hu", "iso-8859-2"},
	{"ja", "shift_jis"},
	{"kk", "windows-1251"},
	{"ko", "euc-kr"},
	{"ku", "windows-1254"},
	{"ky", "windows-1251"},
	{"lt", "windows-1257"},
	{"lv", "windows-1257"},
	{"mk", "windows-1251"},
	{"pl", "iso-8859-2"},
	{"ru", "windows-1251"},
	{"sah", "windows-1251"},
	{"sk", "windows-1250"},
	{"sl", "iso-8859-2"},
	{"sr", "windows-1251"},
	{"tg", "windows-1251"},
	{"th", "windows-874"},
	{"tr", "windows-1254"},
	{"tt", "windows-1251"},
	{"uk", "windows-1251"},
	{"vi", "windows-1258"},
	{"zh-hans", "gb18030"},
	{"zh-hant", "big5"},
}
