package models

import (
	"eta/eta_mobile/utils"
	"github.com/beego/beego/v2/client/orm"
	"github.com/rdlucklib/rdluck_tools/paging"
	"time"
)

// 英文客户Todo状态枚举值
const (
	EnglishCompanyTodoStatusDoing     = "进行中"
	EnglishCompanyTodoStatusCompleted = "已完成"
	EnglishCompanyTodoStatusVoided    = "已作废"
	EnglishCompanyTodoStatusNull      = "无任务"
)

// EnglishCompanyTodo 英文客户TODO任务
type EnglishCompanyTodo struct {
	Id                 int       `orm:"column(id);pk"`
	CompanyId          int       `description:"客户id"`
	Content            string    `description:"任务描述"`
	SellerId           int       `description:"客户所属销售id"`
	SellerName         string    `description:"客户所属销售名称"`
	CreateUserId       int       `description:"创建人用户id"`
	CreateUserName     string    `description:"创建人用户姓名"`
	ApproveUserId      int       `description:"审批人用户id"`
	ApproveUserName    string    `description:"审批人用户姓名"`
	ApprovedSellerId   int       `description:"审批时,客户所属销售id"`
	ApprovedSellerName string    `description:"审批时,客户所属销售名称"`
	Status             string    `description:"任务状态: 枚举值:进行中,已完成,已作废"`
	ModifyTime         time.Time `description:"修改时间"`
	ApproveTime        time.Time `description:"审核时间"`
	CreateTime         time.Time `description:"创建时间"`
	EndTime            time.Time `description:"截止时间"`
	IsDelete           int       `json:"-" description:"是否已经删除,0:未删除,1:已删除;默认:0"`
	Remark             string    `description:"审批备注"`
}

// EnglishCompanyTodoResp 英文客户TODO响应体
type EnglishCompanyTodoResp struct {
	Id              int    `orm:"column(id);pk"`
	CompanyId       int    `description:"客户id"`
	Content         string `description:"任务描述"`
	SellerId        int    `description:"客户所属销售id"`
	SellerName      string `description:"客户所属销售名称"`
	CreateUserId    int    `description:"创建人用户id"`
	CreateUserName  string `description:"创建人用户姓名"`
	ApproveUserId   int    `description:"审批人用户id"`
	ApproveUserName string `description:"审批人用户姓名"`
	Status          string `description:"任务状态: 枚举值:进行中,已完成,已作废"`
	CreateTime      string `description:"创建时间"`
	EndTime         string `description:"截止时间"`
	ApproveTime     string `description:"审核时间"`
	EndTimeStr      string `description:"格式化后的截止时间"`
	Remark          string `description:"审批备注"`
}

func (item *EnglishCompanyTodo) Create() (err error) {
	o := orm.NewOrmUsingDB("rddp")
	id, err := o.Insert(item)
	if err != nil {
		return
	}
	item.CompanyId = int(id)
	return
}

func (item *EnglishCompanyTodo) Update(cols []string) (err error) {
	o := orm.NewOrmUsingDB("rddp")
	_, err = o.Update(item, cols...)
	return
}

// EnglishCompanyTodoAddReq 新增任务请求
type EnglishCompanyTodoAddReq struct {
	CompanyId   int    `description:"客户id"`
	Description string `description:"任务描述"`
	EndTime     string `description:"截止时间"`
}

// EnglishCompanyTodoEditReq 编辑任务请求
type EnglishCompanyTodoEditReq struct {
	Id          int    `description:"客户任务记录id"`
	CompanyId   int    `description:"客户id"`
	Description string `description:"任务描述"`
	EndTime     string `description:"截止时间"`
}

// EnglishCompanyTodoApproveReq 审批任务请求
type EnglishCompanyTodoApproveReq struct {
	Id     int    `description:"客户任务记录id"`
	Remark string `description:"审批备注"`
}

// GetEnglishCompanyTodoById 根据任务ID获取客户任务
func GetEnglishCompanyTodoById(id int) (item *EnglishCompanyTodo, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := `SELECT * FROM english_company_todo WHERE id = ? LIMIT 1 `
	err = o.Raw(sql, id).QueryRow(&item)
	return
}

// GetCountDoingEnglishCompanyTodo 获取正在进行中的任务数量
func GetCountDoingEnglishCompanyTodo(companyId int) (total int, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := `SELECT count(1) AS total FROM english_company_todo WHERE status = "进行中" AND company_id = ? AND is_delete = 0 `
	err = o.Raw(sql, companyId).QueryRow(&total)
	return
}

// GetEnglishCompanyTodoPageListResp 英文客户TODO-分页列表
type GetEnglishCompanyTodoPageListResp struct {
	List   []*EnglishCompanyTodoResp
	Paging *paging.PagingItem `description:"分页数据"`
}

// GetEnglishCompanyTodoList 获取客户任务列表
func GetEnglishCompanyTodoList(companyId, startSize, pageSize int, order string) (total int, items []*EnglishCompanyTodo, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := `SELECT
				a.*
			FROM
				english_company_todo a
			JOIN english_company b ON a.company_id = b.company_id
			WHERE
				a.company_id = ? AND a.status != "已作废" AND a.is_delete = 0 `
	totalSQl := `SELECT COUNT(1) total FROM (` + sql + `) z`
	if err = o.Raw(totalSQl, companyId).QueryRow(&total); err != nil {
		return
	}
	if order != `` {
		sql += order
	} else {
		sql += ` ORDER BY a.create_time DESC`
	}
	sql += ` LIMIT ?,?`
	_, err = o.Raw(sql, companyId, startSize, pageSize).QueryRows(&items)
	return
}

// GetDoingEnglishCompanyTodoList 获取客户的进行中任务列表
func GetDoingEnglishCompanyTodoList(companyId int) (items []*EnglishCompanyTodo, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := `SELECT
				a.*
			FROM
				english_company_todo a
			JOIN english_company b ON a.company_id = b.company_id
			WHERE
				a.company_id = ? AND a.status = "进行中" AND a.is_delete = 0
			ORDER BY
				a.create_time ASC`
	_, err = o.Raw(sql, companyId).QueryRows(&items)
	return
}

// GetEnglishCompanyLatestTodoByCompanyIds 获取英文客户最新的一条TODO任务
func GetEnglishCompanyLatestTodoByCompanyIds(companyIds []int) (items []*EnglishCompanyTodo, err error) {
	itemsLen := len(companyIds)
	if itemsLen == 0 {
		return
	}
	o := orm.NewOrmUsingDB("rddp")
	sql := `SELECT b.* FROM 
			(
				SELECT
					company_id,
					MAX(create_time) AS ct
				FROM
					english_company_todo
				WHERE
					is_delete = 0 AND status != "已作废" AND company_id IN (` + utils.GetOrmInReplace(itemsLen) + `)
				GROUP BY
					company_id
			) AS a
			LEFT JOIN english_company_todo AS b ON b.company_id = a.company_id AND b.create_time = a.ct `
	_, err = o.Raw(sql, companyIds).QueryRows(&items)
	return
}

type EnglishCompanyTodoDoing struct {
	Id                 int       `description:"待办ID"`
	CompanyId          int       `description:"客户id"`
	CompanyName        string    `description:"客户名称"`
	Content            string    `description:"任务描述"`
	SellerId           int       `description:"客户所属销售id"`
	SellerName         string    `description:"客户所属销售名称"`
	CreateUserId       int       `description:"创建人用户id"`
	CreateUserName     string    `description:"创建人用户姓名"`
	ApproveUserId      int       `description:"审批人用户id"`
	ApproveUserName    string    `description:"审批人用户姓名"`
	ApprovedSellerId   int       `description:"审批时,客户所属销售id"`
	ApprovedSellerName string    `description:"审批时,客户所属销售名称"`
	Status             string    `description:"任务状态: 枚举值:进行中,已完成,已作废"`
	ModifyTime         time.Time `description:"修改时间"`
	ApproveTime        time.Time `description:"审核时间"`
	CreateTime         time.Time `description:"创建时间"`
	EndTime            time.Time `description:"截止时间"`
	Remark             string    `description:"审批备注"`
}

type EnglishCompanyTodoDoingResp struct {
	Id              int    `description:"待办ID"`
	CompanyId       int    `description:"客户id"`
	CompanyName     string `description:"客户名称"`
	Content         string `description:"任务描述"`
	SellerId        int    `description:"客户所属销售id"`
	SellerName      string `description:"客户所属销售名称"`
	CreateUserId    int    `description:"创建人用户id"`
	CreateUserName  string `description:"创建人用户姓名"`
	ApproveUserId   int    `description:"审批人用户id"`
	ApproveUserName string `description:"审批人用户姓名"`
	Status          string `description:"任务状态: 枚举值:进行中,已完成,已作废"`
	CreateTime      string `description:"创建时间"`
	EndTime         string `description:"截止时间"`
	ApproveTime     string `description:"审核时间"`
	Remark          string `description:"审批备注"`
}

// GetEnglishCompanyTodoDoingPageListResp 英文客户未完成TODO-分页列表
type GetEnglishCompanyTodoDoingPageListResp struct {
	List   []*EnglishCompanyTodoDoingResp
	Paging *paging.PagingItem `description:"分页数据"`
}

// GetEnglishCompanyTodoDoingList 获取客户任务未完成列表
func GetEnglishCompanyTodoDoingList(startSize, pageSize int, order string) (total int, items []*EnglishCompanyTodoDoing, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := `SELECT
				a.*,
				b.company_name
			FROM
				english_company_todo a
			JOIN english_company b ON a.company_id = b.company_id
			WHERE
				a.status = "进行中" AND a.is_delete = 0 `
	totalSQl := `SELECT COUNT(1) total FROM (` + sql + `) z`
	if err = o.Raw(totalSQl).QueryRow(&total); err != nil {
		return
	}
	if order != `` {
		sql += order
	} else {
		sql += ` ORDER BY a.end_time ASC`
	}
	sql += ` LIMIT ?,?`
	_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
	return
}

// DeleteEnglishCompanyTodoByCompanyId (软)删除英文客户TODO
func DeleteEnglishCompanyTodoByCompanyId(companyId int) (err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := `UPDATE english_company_todo SET is_delete = 1 WHERE company_id = ?`
	_, err = o.Raw(sql, companyId).Exec()
	return
}