package domain

import "time"

const (
	TASK_TYPE_TO_BE_RELEASED = iota + 1 //待发布
)

// 任务
type Task struct {
	// 任务ID
	TakeId int64 `json:"takeId"`
	// 任务名称
	TaskName string `json:"taskName"`
	// 任务类型Type
	TaskType int `json:"taskType"`
	// 任务发起者
	Sponsor *EmployeeInfo `json:"sponsor"`
	// 任务状态
	TaskStatus int `json:"taskStatus"`
	// 引用资源
	ReferenceResource *ReferenceResource `json:"referenceResource"`
	// 客户价值列表
	CustomerValue []string `json:"customerValue"`
	// 任务性质
	TaskNature string `json:"taskNature"`
	// 奖励素币
	SuMoney float64 `json:"suMoney"`
	// 验收标准
	AcceptanceStandard string `json:"acceptanceStandard"`
	// 任务描述
	TaskDescription string `json:"taskDescription"`
	// 任务图片URL列表
	TaskPictureUrls []string `json:"taskPictureUrls"`
	// 是否悬赏任务
	IsRewardTake bool `json:"isRewardTake"`
	// 创建时间
	CreateTime time.Time `json:"createTime"`
	// 抢单任务信息
	RobInfo *RobInfo `json:"robInfo"`
	// 竞标任务信息
	BidInfo *BidInfo `json:"bidInfo"`
	// 任务参与者列表
	Participants []*EmployeeInfo `json:"participants"`
	// 任务贡献占比
	TaskPercentage []*TaskPercentageItem `json:"taskPercentage"`
	// 解决报告
	SolveReport string `json:"solveReport"`
	// 解决图片URL列表
	SolvePictureUrls []string `json:"solvePictureUrls"`
}

type TaskRepository interface {
	Save(task *Task) (*Task, error)
	Remove(task *Task) (*Task, error)
	FindOne(queryOptions map[string]interface{}) (*Task, error)
	Find(queryOptions map[string]interface{}) (int64, []*Task, error)
}

func (task *Task) Identify() interface{} {
	if task.TakeId == 0 {
		return nil
	}
	return task.TakeId
}

func (task *Task) Update(data map[string]interface{}) error {
	if taskName, ok := data["taskName"]; ok {
		task.TaskName = taskName.(string)
	}
	if taskType, ok := data["taskType"]; ok {
		task.TaskType = taskType.(int)
	}
	if customerValue, ok := data["customerValue"]; ok {
		task.CustomerValue = customerValue.([]string)
	}
	if taskNature, ok := data["taskNature"]; ok {
		task.TaskNature = taskNature.(string)
	}
	if suMoney, ok := data["suMoney"]; ok {
		task.SuMoney = suMoney.(float64)
	}
	if acceptanceStandard, ok := data["acceptanceStandard"]; ok {
		task.AcceptanceStandard = acceptanceStandard.(string)
	}
	if taskDescription, ok := data["taskDescription"]; ok {
		task.TaskDescription = taskDescription.(string)
	}
	if taskPictureUrls, ok := data["taskPictureUrls"]; ok {
		task.TaskPictureUrls = taskPictureUrls.([]string)
	}
	if isRewardTake, ok := data["isRewardTake"]; ok {
		task.IsRewardTake = isRewardTake.(bool)
	}
	return nil
}