package util

import (
	"bufio"
	"bytes"
	"fmt"
	"go/format"
	"io/ioutil"
	"os"
	"path/filepath"
	"strings"
	"text/template"
	"time"

	"github.com/logrusorgru/aurora"

	"zero/core/logx"
)

func CreateIfNotExist(file string) (*os.File, error) {
	_, err := os.Stat(file)
	if !os.IsNotExist(err) {
		return nil, fmt.Errorf("%s already exist", file)
	}

	return os.Create(file)
}

func RemoveIfExist(filename string) error {
	if !FileExists(filename) {
		return nil
	}

	return os.Remove(filename)
}

func RemoveOrQuit(filename string) error {
	if !FileExists(filename) {
		return nil
	}

	fmt.Printf("%s exists, overwrite it?\nEnter to overwrite or Ctrl-C to cancel...",
		aurora.BgRed(aurora.Bold(filename)))
	bufio.NewReader(os.Stdin).ReadBytes('\n')

	return os.Remove(filename)
}

func FileExists(file string) bool {
	_, err := os.Stat(file)
	return err == nil
}

func FileNameWithoutExt(file string) string {
	return strings.TrimSuffix(file, filepath.Ext(file))
}

func CreateTemplateAndExecute(filename, text string, arg map[string]interface{}, forceUpdate bool, disableFormatCodeArgs ...bool) error {
	if FileExists(filename) && !forceUpdate {
		return nil
	}
	var buffer = new(bytes.Buffer)
	templateName := fmt.Sprintf("%d", time.Now().UnixNano())
	t, err := template.New(templateName).Parse(text)
	if err != nil {
		return err
	}
	err = t.Execute(buffer, arg)
	if err != nil {
		return err
	}
	var disableFormatCode bool
	for _, f := range disableFormatCodeArgs {
		disableFormatCode = f
	}
	var bts = buffer.Bytes()
	s := buffer.String()
	logx.Info(s)
	if !disableFormatCode {
		bts, err = format.Source(buffer.Bytes())
		if err != nil {
			return err
		}
	}
	return ioutil.WriteFile(filename, bts, os.ModePerm)
}

func FormatCodeAndWrite(filename string, code []byte) error {
	if FileExists(filename) {
		return nil
	}
	bts, err := format.Source(code)
	if err != nil {
		return err
	}
	return ioutil.WriteFile(filename, bts, os.ModePerm)
}
