package util

import (
	"errors"
	"os"
	"os/exec"
	"strings"
)

// GitPull 拉取代码，丢弃本地修改
func GitPull() error {
	workDir, err := os.Getwd()
	if err != nil {
		return err
	}

	// 先强制重置本地更改
	resetCmd := exec.Command("git", "reset", "--hard", "HEAD")
	resetCmd.Dir = workDir
	resetOutput, err := resetCmd.CombinedOutput()
	if err != nil {
		return errors.New(string(resetOutput) + err.Error())
	}

	// 获取当前分支名
	branchCmd := exec.Command("git", "rev-parse", "--abbrev-ref", "HEAD")
	branchCmd.Dir = workDir
	branchOutput, err := branchCmd.CombinedOutput()
	if err != nil {
		return errors.New(string(branchOutput) + err.Error())
	}
	currentBranch := strings.TrimSpace(string(branchOutput)) // 移除换行符和空格

	// 获取远程仓库名，通常是origin
	remoteCmd := exec.Command("git", "remote")
	remoteCmd.Dir = workDir
	remoteOutput, err := remoteCmd.CombinedOutput()
	if err != nil {
		return errors.New(string(remoteOutput) + err.Error())
	}
	remoteName := "origin" // 默认使用origin，如果没有远程仓库则使用默认值
	if len(remoteOutput) > 0 {
		remoteName = strings.TrimSpace(string(remoteOutput))
	}

	// 先获取所有远程分支最新信息
	fetchCmd := exec.Command("git", "fetch", "--all")
	fetchCmd.Dir = workDir
	fetchOutput, err := fetchCmd.CombinedOutput()
	if err != nil {
		return errors.New(string(fetchOutput) + err.Error())
	}

	// 构建远程分支引用
	remoteBranch := remoteName + "/" + currentBranch

	// 检查远程分支是否存在
	checkRemoteCmd := exec.Command("git", "rev-parse", "--verify", remoteBranch)
	checkRemoteCmd.Dir = workDir
	if checkRemoteErr := checkRemoteCmd.Run(); checkRemoteErr != nil {
		// 远程分支不存在，只进行本地重置
		return nil
	}

	// 强制重置当前分支到远程分支（处理远程分支被force push的情况）
	forceResetCmd := exec.Command("git", "reset", "--hard", remoteBranch)
	forceResetCmd.Dir = workDir
	forceResetOutput, err := forceResetCmd.CombinedOutput()
	if err != nil {
		return errors.New(string(forceResetOutput) + err.Error())
	}

	return nil
}
