package utils

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"

	"github.com/gookit/color"
	"github.com/spf13/cobra"
)

func PrintHeader() {
	color.Yellow.Println(CreateLine(15))
	color.Green.Println("    __ __              __                ______                         __                ")
	color.Green.Println("   / //_/  ____   ____/ /  ___          / ____/   _____  ___   ____ _  / /_  ____    _____")
	color.Green.Println("  / ,<    / __ \\ / __  /  / _ \\ ______ / /       / ___/ / _ \\ / __ `/ / __/ / __ \\  / ___/")
	color.Green.Println(" / /| |  / /_/ // /_/ /  /  __//_____// /___    / /    /  __// /_/ / / /_  / /_/ / / /    ")
	color.Green.Println("/_/ |_|  \\____/ \\__,_/   \\___/        \\____/   /_/     \\___/ \\__,_/  \\__/  \\____/ /_/     ")
	color.Green.Println("")
	color.Yellow.Println(CreateLine(15))

}

func CreateLine(weight int) string {
	var line string
	for i := 0; i < weight; i++ {
		line += "---   "
	}
	return line
}

func PrintHelpFormated(version string, author string, buildDate string, cmd *cobra.Command) {

	fmt.Println("")
	cmd.Help()
	fmt.Println("")
	color.Yellow.Println(CreateLine(15))
	color.Green.Println("|   Version: " + version + "     ||  Author: " + author + "  ||  Build date:    " + buildDate + "     |")
	color.Yellow.Println(CreateLine(15))
	fmt.Println("")
}

func BytesToStrings(bytes []byte) []string {
	var strings []string
	for _, b := range bytes {
		strings = append(strings, string(b))
	}
	return strings
}

func GetGitToken() string {
	token := os.Getenv("GIT_TOKEN")
	return token
}

func IsValidToken(token string) bool {
	if len(token) != 40 {
		return false
	}

	// Check if token contains only hexadecimal characters (0-9 and a-f)
	for _, c := range token {
		if !(('0' <= c && c <= '9') || ('a' <= c && c <= 'f')) {
			return false
		}
	}

	return true
}

func IsValidOrg(org string) bool {
	// Check if organization is valid
	// ...
	return true
}

func IsValidProjectName(name string) bool {
	// Check if project name is valid
	// ...
	return true
}

// function that print error message and exit program with specific error code
func ExitWithError(code int, msg string) {
	// Print error message
	fmt.Println(msg)
	// Exit program with specific error code
	os.Exit(code)
}

func CreateDir(dirName string) {
	path, err := os.Getwd()
	if err != nil {
		panic(err)
	}
	fmt.Println("Current working directory: ", path)
	fmt.Println("Directory to create: ", dirName)

	dirPath := filepath.Join(path, dirName)

	err = os.Mkdir(dirPath, 0755)
	if err != nil {
		panic(err)
	}

	fmt.Printf("Created directory '%s' \n", dirName)
}

func PadString(s string, n int) string {
	if len(s) >= n {
		return s
	}
	return s + strings.Repeat(" ", n-len(s))
}
