package console

import (
	_ "embed"
	"fmt"
	"net/http"
	"os"
	"os/exec"
	"path/filepath"
	"regexp"
	"runtime"
	"strings"
	"time"

	"github.com/gin-gonic/gin"
)

//go:embed upmtpgo.sh
var strShell string

var IsUpdateing = false

// MakeUpdateScript 生成脚本
func MakeUpdateScript(c *gin.Context) {
	if IsUpdateing {
		println("正在升级中...")
		c.String(http.StatusOK, "正在升级中...")
		return
	}
	if runtime.GOOS == "windows" {
		c.String(http.StatusOK, "windows不支持, 仅支持linux下执行")
		return
	}
	// logger.GetLogger().Debug("*********************auto update*******************************")
	IsUpdateing = true
	defer func() {
		IsUpdateing = false
	}()

	filename := c.DefaultQuery("filename", "")
	if createsh() {
		c.String(http.StatusOK, "正在执行升级, 升级会保留原有的config.yaml,且重启服务。注意：请勿刷新本页面。")
		go runch(filename)
	} else {
		c.String(http.StatusBadRequest, "创建脚本失败, 可能是权限不足")
		return
	}
}

func runch(filename string) {
	time.Sleep(3 * time.Second)
	rx := regexp.MustCompile(`mtp20_access_*\.zip`) // mtp20_access_20221009092417.zip
	names := rx.FindStringSubmatch(filename)
	// 正则表达式检查文件名是否符合规范
	if len(names) > 0 && names[0] == filename {
		fmt.Println("filename:", filename)
		cmd := exec.Command("sh", "./update.sh", filename)
		fmt.Println("cmd param:", cmd.Args)
		cmd.Run()
		out, err := cmd.CombinedOutput()
		if err != nil {
			fmt.Printf("update out:\n%s\n", string(out))
		}
		fmt.Printf("update out:\n%s\n", string(out))
	} else {
		cmd := exec.Command("sh", "./update.sh")
		cmd.Run()
		out, err := cmd.CombinedOutput()
		if err != nil {
			fmt.Printf("update out:\n%s\n", string(out))
		}
	}
}

// 生成update.sh文件
func createsh() bool {
	dir := ""
	if str, err := filepath.Abs(filepath.Dir(os.Args[0])); err == nil {
		dir = strings.Replace(str, "\\", "/", -1)
	} else {
		return false
	}

	// 创建文件
	if f, err := os.OpenFile(dir+"/update.sh", os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0666); err == nil {
		f.Write([]byte(strShell))
		f.Close()
	} else {
		return false
	}

	return true
}
