package task

import (
	logger "eta_mini_ht_api/common/component/log"
	"eta_mini_ht_api/models"
	"gorm.io/gorm"
	"time"
)

// VerificationStatus is an enumeration for the status field.
type TaskStatus string

const (
	StatusPending TaskStatus = "PENDING"
	StatusProcess TaskStatus = "PROGRESS"
	StatusSuccess TaskStatus = "SUCCESS"
	StatusFailed  TaskStatus = "FAILED"
)

type Task struct {
	ID          int        `gorm:"primary_key;auto_increment;comment:'主键'"`
	TaskType    string     `gorm:"type:enum('');default:null;comment:'任务类型'"`
	Details     string     `gorm:"type:json;default:null;comment:'任务详情'"`
	Status      TaskStatus `gorm:"type:enum('PENDING','PROGRESS','SUCCESS','FAILED');not null;comment:'任务状态'"`
	CreatedTime time.Time  `gorm:"default:null;comment:'创建时间'"`
	UpdatedTime time.Time  `gorm:"default:null;comment:'更新时间'"`
}

// 在使用前,需要注册 Enum 类型
func (v *Task) BeforeCreate(_ *gorm.DB) (err error) {
	v.CreatedTime = time.Now()
	if v.Status == "" {
		v.Status = StatusPending
	}
	return
}
func InitTask(task Task) (taskId int, err error) {
	err = models.Main().Create(&task).Error
	if err != nil {
		logger.Error("创建任务记录失败:%v", err)
	}
	taskId = task.ID
	return
}

func UpdateTaskStatusById(taskId int, status TaskStatus) (err error) {
	err = updateColumnById(taskId, "status", status)
	if err != nil {
		logger.Error("修改任务状态失败,id:[%d],状态:%v:%v", taskId, status, err)
	}
	return
}

func UpdateDetailsAndStatusById(taskId int, status TaskStatus, details string) {
	columns := map[string]interface{}{
		"details": details,
		"status":  status,
	}
	err := updateColumnsById(taskId, columns)
	if err != nil {
		logger.Error("修改任务失败,id:[%d]:%v", taskId, err)
	}
	return
}

func updateColumnsById(id int, value interface{}) (err error) {
	err = models.Main().Model(&Task{}).Where("id =?", id).UpdateColumns(value).Error
	return
}
func updateColumnById(id int, column string, value interface{}) (err error) {
	err = models.Main().Model(&Task{}).Where("id =?", id).UpdateColumn(column, value).Error
	return
}