package hpc

import (
	"context"
	"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/constants"
	"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/models"
	"k8s.io/apimachinery/pkg/util/json"
	"math/rand"
	"time"

	"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/svc"
	"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/types"

	"github.com/zeromicro/go-zero/core/logx"
)

type CommitHpcTaskLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewCommitHpcTaskLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CommitHpcTaskLogic {
	return &CommitHpcTaskLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *CommitHpcTaskLogic) CommitHpcTask(req *types.CommitHpcTaskReq) (resp *types.CommitHpcTaskResp, err error) {

	// 构建主任务结构体
	taskModel := models.Task{
		Status:      constants.Saved,
		Description: req.Description,
		Name:        req.Name,
		CommitTime:  time.Now(),
	}
	// 保存任务数据到数据库
	tx := l.svcCtx.DbEngin.Create(&taskModel)
	if tx.Error != nil {
		return nil, tx.Error
	}

	var clusterIds []int64
	l.svcCtx.DbEngin.Raw("SELECT id FROM `t_cluster` where adapter_id = ? and label = ?", req.AdapterId, req.ClusterType).Scan(&clusterIds)

	env, _ := json.Marshal(req.Environment)

	if len(clusterIds) == 0 || clusterIds == nil {
		return nil, nil
	}

	hpcInfo := models.TaskHpc{
		TaskId:      taskModel.Id,
		ClusterId:   clusterIds[rand.Intn(len(clusterIds))],
		Name:        taskModel.Name,
		Status:      "Saved",
		CmdScript:   req.CmdScript,
		StartTime:   time.Now().String(),
		CardCount:   req.CardCount,
		WorkDir:     req.WorkDir,
		WallTime:    req.WallTime,
		AppType:     req.AppType,
		AppName:     req.AppName,
		Queue:       req.Queue,
		SubmitType:  req.SubmitType,
		NNode:       req.NNode,
		StdOutFile:  req.StdOutFile,
		StdErrFile:  req.StdErrFile,
		StdInput:    req.StdInput,
		DeletedFlag: 0,
		CreatedBy:   0,
		CreatedTime: time.Now(),
		UpdatedBy:   0,
		UpdatedTime: time.Now(),
		Environment: string(env),
	}

	tx = l.svcCtx.DbEngin.Create(&hpcInfo)
	if tx.Error != nil {
		return nil, tx.Error
	}
	// todo mq task manage
	//reqMessage, err := json.Marshal(mqInfo)
	//if err != nil {
	//	logx.Error(err)
	//	return nil, err
	//}
	//publish := l.svcCtx.RedisClient.Publish(context.Background(), mqInfo.TaskType, reqMessage)
	//if publish.Err() != nil {
	//	return nil, publish.Err()
	//}
	resp = &types.CommitHpcTaskResp{
		Code:   200,
		Msg:    "success",
		TaskId: taskModel.Id,
	}
	return resp, nil
}
