package config

import (
	"fmt"
	"os"

	"github.com/deranjer/store"
)

// ConfigPath is the global path to the config that is injected from the main client package.
var ConfigPath string

// ValidateConfig will go through the entire config and do basic sanity checks
func ValidateConfig(conf *Gvcconfig, version string) error {
	if conf.Version == "" { // No version found, should we update it?
		fmt.Printf("No version found, inputing current client version: %s\n", version)
		conf.Version = version
	}
	if conf.RootPath == "" {
		path, err := os.Getwd()
		if err != nil {
			return fmt.Errorf("unable to get current working directory, and rootpath of repo is not set: %s", err)
		}
		fmt.Printf("No root path found, inputting current working directory: %s\n", path)
	}
	err := validateRemotes(conf)
	if err != nil {
		return err
	}
	err = validateCompress(conf)
	if err != nil {
		return err
	}
	//TODO validate ignores (pretty similar to compress)
	return nil
}

// validateCompress checks the compression settings to make sure they are valid //TODO return error needed?
func validateCompress(conf *Gvcconfig) error {
	compress := conf.NoCompress
	for i, file := range compress.Files {
		if file == "" {
			fmt.Println("empty file in compress files, removing... ")
			compress.Files[i] = compress.Files[len(compress.Files)-1]
			continue
		}
		// TODO: write more validation
	}
	for i, folder := range compress.Folders {
		file, err := os.Stat(folder) // TODO: check to see if it returns ABS or not, might need to convert
		if err != nil {
			continue
		}
		// if err != nil { //TODO: Don't think we should see if it doesn't exits, it may exist in future
		// 	fmt.Println("unable to find folder listed in array, removing it: ", folder)
		// 	compress.Folders[i] = compress.Folders[len(compress.Folders)-1]
		// 	continue
		// }
		fileType := file.Mode()
		if fileType.IsRegular() { // Not a folder
			fmt.Println("compressed folder in array is not actually a folder, moving it to file compress: ", folder)
			compress.Folders[i] = compress.Folders[len(compress.Folders)-1]
			compress.Files = append(compress.Files, folder)
			continue
		}
	}
	for i, ext := range compress.Exts {
		if ext == "" {
			fmt.Println("empty ext in compress exts, removing... ")
			compress.Exts[i] = compress.Exts[len(compress.Exts)-1]
			continue
		}
		// TODO: validate there is a "." in front of the ext, if not add it?
	}
	err := store.Save(ConfigPath, &conf)
	if err != nil {
		fmt.Println("Error saving config back to toml file: ", err)
	}
	return nil
}

// validateRemotes ranges through all of the remotes and validates them
func validateRemotes(conf *Gvcconfig) error {
	remotes := conf.Remotes
	for _, remote := range remotes {
		if remote.Name == "" {
			return fmt.Errorf("Unnamed remote found in config, all remotes require name")
		}
		if remote.Host == "" {
			return fmt.Errorf("Host cannot be empty: %s in %s", remote.Name, remote.Host)
		} // Checking for a valid port // TODO: might need to move this function to common library, feel like we will need this in the future?
		if remote.Port == 0 || remote.Port == 1 || remote.Port > 65535 { // TODO: edit the config library to allow default options?
			fmt.Printf("Remote %s did not have a valid port set, setting it to the default port 8888", remote.Name)
			remote.Port = 8888
			conf.Remotes = append(conf.Remotes, remote)
		}
	}
	return nil
}
