package main

import (
	"errors"
	"fmt"
	"image"
	_ "image/png"
	"io/ioutil"
	"os"
	"path/filepath"
	"strings"
)

func main() {
	files, _ := ioutil.ReadDir("./static/images")
	for _, imgFile := range files {
		fullPath := filepath.Join("./static/images", imgFile.Name())
		if strings.Contains(fullPath, ".webp") || strings.Contains(fullPath, ".gif") || strings.Contains(fullPath, ".jpg") {
			err := os.Remove(fullPath)
			if err != nil {
				panic(err)
			}
			continue
		}
		if reader, err := os.Open(fullPath); err == nil {
			im, _, err := image.DecodeConfig(reader)
			if err != nil {
				panic(err)
			}
			err = reader.Close()
			if err != nil {
				panic(err)
			}
			if im.Height < 256 || im.Width < 256 {
				err := os.Remove(fullPath)
				if err != nil {
					panic(err)
				}
				continue
			}
			if strings.Contains(imgFile.Name(), "(") {
				newName := imgFile.Name()[:strings.Index(imgFile.Name(), "(")-1] + imgFile.Name()[strings.Index(imgFile.Name(), ")")+1:]
				err := os.Rename(fullPath, filepath.Join("./static/images", newName))
				if err != nil {
					panic(err)
				}
			}
		} else {
			panic(err)
		}

	}

	pokemonListBytes, err := ioutil.ReadFile("./cmd/init/pokemon-list.txt")
	if err != nil {
		panic(err)
	}
	pokemonList := strings.Split(string(pokemonListBytes), "\r\n")

	shinesEnabledBytes, err := ioutil.ReadFile("./cmd/init/shiny-enabled.txt")
	if err != nil {
		panic(err)
	}
	shinesEnabled := strings.Split(string(shinesEnabledBytes), "\r\n")

	for i := 1; i < 867; i++ {
		shinyImageName := fmt.Sprintf("%03d-00-shiny.png", i)
		if !doesFileExist(shinyImageName) {
			shinyImageName := fmt.Sprintf("%03d-31-shiny.png", i)
			if !doesFileExist(shinyImageName) {
				shinyImageName := fmt.Sprintf("%03d-61-shiny.png", i)
				if !doesFileExist(shinyImageName) {
					continue
				}
			}
		}
		imageName := fmt.Sprintf("%03d-00.png", i)
		if !doesFileExist(shinyImageName) {
			shinyImageName = fmt.Sprintf("%03d-31.png", i)
			if !doesFileExist(shinyImageName) {
				shinyImageName = fmt.Sprintf("%03d-61.png", i)
				if !doesFileExist(shinyImageName) {
					panic(errors.New("non-shiny not found"))
				}
			}
		}
		fmt.Printf("INSERT INTO pokemon (id, name, shiny_enabled, shiny_image_name, image_name) \n VALUES (%d, '%s', %t, '%s', '%s'); \n \n", i, pokemonList[i-1], isShinyEnabled(shinesEnabled, pokemonList[i-1]), shinyImageName, imageName)
	}
}

func doesFileExist(fileName string) bool {
	if _, err := os.Stat(fmt.Sprintf("./static/images/%s", fileName)); os.IsNotExist(err) {
		return false
	}
	return true
}

func isShinyEnabled(shinesEnabled []string, pokemon string) bool {
	for _, shinyEnabled := range shinesEnabled {
		if pokemon == shinyEnabled {
			return true
		}
	}
	return false
}
