package ai

import (
	"encoding/json"
	"fmt"
)

type ResultSyncParameter interface {
	ResultSyncParam()
}

type ResultSyncReq struct {
	ClusterId string              `json:"clusterId"`
	Src       Source              `json:"src,omitempty"`
	Param     ResultSyncParameter `json:"param,omitempty"`
}

type ResultSyncResp struct {
	Code     int32  `json:"code,omitempty" copier:"Code"`
	Msg      string `json:"msg,omitempty" copier:"Msg"`
	ErrorMsg string `json:"errorMsg,omitempty" copier:"ErrorMsg"`
}

type OpenISync struct {
	Id            string `json:"id,omitempty"`
	RepoName      string `json:"repoName,omitempty"`
	ParentDir     string `json:"parentDir,omitempty"`
	BootFile      string `json:"bootFile,omitempty"`
	DefaultBranch string `json:"defaultBranch,omitempty"`
}

func (o *OpenISync) ResultSyncParam() {

}

type OctopusSync struct {
}

func (o *OctopusSync) ResultSyncParam() {

}
func (cp *ResultSyncReq) UnmarshalJSON(data []byte) error {
	// 临时结构体：用于捕获原始 JSON 中的 param 字段数据
	type TempCreateParam struct {
		ClusterId string          `json:"clusterId"`
		Src       Source          `json:"src,omitempty"`
		Param     json.RawMessage `json:"param,omitempty"` // 捕获原始 JSON 数据
	}
	var temp TempCreateParam
	if err := json.Unmarshal(data, &temp); err != nil {
		return err
	}

	// 将临时结构体的字段赋值给原结构体（除 Param 外）
	cp.ClusterId = temp.ClusterId
	cp.Src = temp.Src

	// 解析 param 字段的原始数据为具体类型
	if temp.Param != nil {
		// 尝试解析为 OpenI 类型
		var openi OpenISync
		if err := json.Unmarshal(temp.Param, &openi); err != nil {
			// 打印详细错误（如字段不匹配、类型错误等）
			fmt.Printf("解析 OpenI 失败: %v\n", err) // 关键调试日志
		} else {
			cp.Param = &openi
			return nil
		}

		// 新增：尝试解析为 Octopus 类型
		var octopus OctopusSync
		if err := json.Unmarshal(temp.Param, &octopus); err == nil {
			cp.Param = &octopus
			return nil
		}

		return fmt.Errorf("unsupported param type in CreateParam")
	}

	return nil
}
