package company

import (
	"github.com/beego/beego/v2/client/orm"
	"time"
)

// CompanyProductTryOutUpdateLog 客户产品试用变更日志表
type CompanyProductTryOutUpdateLog struct {
	Id          int       `orm:"column(id);pk"`
	CompanyId   int       `description:"客户id"`
	ProductId   int       `description:"产品id"`
	SellerId    int       `description:"销售id"`
	SellerName  string    `description:"销售名称"`
	Source      string    `description:"来源"`
	StartDate   time.Time `description:"开始日期"`
	EndDate     time.Time `description:"结束日期"`
	RealEndDate time.Time `description:"实际结束日期"`
	IsStop      int       `description:"是否已经终止了，0：进行中；1：已终止"`
	CreateTime  time.Time `description:"创建时间"`
}

// Update 更新客户产品试用变更日志
func (item *CompanyProductTryOutUpdateLog) Update(cols []string) (err error) {
	o := orm.NewOrm()
	_, err = o.Update(item, cols...)
	return
}

// CompanyProductTryOutUpdatePermissionLog 客户产品变更品种详情表
type CompanyProductTryOutUpdatePermissionLog struct {
	Id                        int       `orm:"column(id);pk"`
	CompanyProductUpdateLogId int       `description:"产品变更id"`
	ChartPermissionId         int       `description:"品种权限id"`
	StartDate                 time.Time `description:"开始日期"`
	EndDate                   time.Time `description:"结束日期"`
	RealEndDate               time.Time `description:"实际结束日期"`
	IsStop                    int       `description:"是否已经终止了，0：进行中；1：已终止"`
	CreateTime                time.Time `description:"创建时间"`
}

// Update 更新客户产品变更品种详情
func (item *CompanyProductTryOutUpdatePermissionLog) Update(cols []string) (err error) {
	o := orm.NewOrm()
	_, err = o.Update(item, cols...)
	return
}

// AddCompanyProductTryOutUpdateLog 新增客户试用产品变更日志
func AddCompanyProductTryOutUpdateLog(item *CompanyProductTryOutUpdateLog, companyReportPermissionList []*CompanyReportPermission) (err error) {
	o := orm.NewOrm()
	lastId, err := o.Insert(item)
	if err != nil {
		return
	}
	item.Id = int(lastId)

	companyProductUpdatePermissionLogList := make([]*CompanyProductTryOutUpdatePermissionLog, 0)
	for _, v := range companyReportPermissionList {
		tmpCompanyProductUpdatePermissionLog := &CompanyProductTryOutUpdatePermissionLog{
			//Id:                        0,
			CompanyProductUpdateLogId: item.Id,
			ChartPermissionId:         v.ChartPermissionId,
			StartDate:                 item.StartDate,
			EndDate:                   item.EndDate,
			RealEndDate:               item.StartDate,
			IsStop:                    item.IsStop,
			CreateTime:                item.CreateTime,
		}
		companyProductUpdatePermissionLogList = append(companyProductUpdatePermissionLogList, tmpCompanyProductUpdatePermissionLog)
	}

	if len(companyProductUpdatePermissionLogList) > 0 {
		_, err = o.InsertMulti(len(companyProductUpdatePermissionLogList), companyProductUpdatePermissionLogList)
	}

	{
		// 获取当前正在进行中的客户变更试用的数据
		findProgress, _ := GetCompanyProductTryOutUpdateLogItem(item.CompanyId, item.ProductId)
		// 如果没有的话，那么就将试用天数+1
		if findProgress != nil {
			sql := `UPDATE  company_product
			SET
			  try_out_day_total = try_out_day_total+1
			WHERE company_id = ? AND product_id = ?`
			_, err = o.Raw(sql, item.CompanyId, item.ProductId).Exec()
		}
	}
	return
}

// GetCompanyProductTryOutUpdateLogItem 获取当前正在进行中的客户变更试用的数据
func GetCompanyProductTryOutUpdateLogItem(companyId, productId int) (item *CompanyProductTryOutUpdateLog, err error) {
	o := orm.NewOrm()
	sql := ` select * from company_product_try_out_update_log where company_id=? and product_id=? and is_stop = 0`
	err = o.Raw(sql, companyId, productId).QueryRow(&item)
	return
}

// GetCompanyProductTryOutUpdateGroup 获取当前正在进行中的客户变更试用的数据
func GetCompanyProductTryOutUpdateGroup() (items []*CompanyProductTryOutUpdateLog, err error) {
	o := orm.NewOrm()
	sql := ` select * from company_product_try_out_update_log group by company_id,product_id;`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// GetCompanyProductTryOutUpdateNoStopGroup 获取当前正在进行中的客户变更试用的数据（未停止的）
func GetCompanyProductTryOutUpdateNoStopGroup() (items []*CompanyProductTryOutUpdateLog, err error) {
	o := orm.NewOrm()
	sql := ` select * from company_product_try_out_update_log where is_stop=0 group by company_id,product_id;`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// GetCompanyProductTryOutUpdateList 获取当前正在进行中的客户变更试用的数据
func GetCompanyProductTryOutUpdateList(companyId, productId int) (items []*CompanyProductTryOutUpdateLog, err error) {
	o := orm.NewOrm()
	sql := ` select * from company_product_try_out_update_log Where company_id=? and product_id=? order by create_time asc;`
	_, err = o.Raw(sql, companyId, productId).QueryRows(&items)
	return
}

// GetCompanyProductTryOutUpdateNoStopList 获取当前正在进行中的客户变更试用的数据（未停止的）
func GetCompanyProductTryOutUpdateNoStopList(companyId, productId int) (items []*CompanyProductTryOutUpdateLog, err error) {
	o := orm.NewOrm()
	sql := ` select * from company_product_try_out_update_log Where company_id=? and product_id=? AND is_stop=0 order by create_time asc;`
	_, err = o.Raw(sql, companyId, productId).QueryRows(&items)
	return
}

// GetCompanyProductTryOutUpdateNoStopListByEndDate 获取当前正在进行中的客户变更试用的数据（未停止的）
func GetCompanyProductTryOutUpdateNoStopListByEndDate(companyId, productId int) (items []*CompanyProductTryOutUpdateLog, err error) {
	o := orm.NewOrm()
	sql := ` select * from company_product_try_out_update_log Where company_id=? and product_id=? AND is_stop=0 order by end_date desc;`
	_, err = o.Raw(sql, companyId, productId).QueryRows(&items)
	return
}

// AddCompanyProductUpdatePermissionLog 客户产品变更品种详情日志
func AddCompanyProductUpdatePermissionLog(item *CompanyProductTryOutUpdatePermissionLog) (lastId int64, err error) {
	o := orm.NewOrm()
	lastId, err = o.Insert(item)
	return
}

// GetCompanyProductTryOutUpdateLogTotal 获取客户转试用的记录列表
func GetCompanyProductTryOutUpdateLogTotal(companyId, productId int) (total int, err error) {
	o := orm.NewOrm()
	var pars []interface{}
	sql := `select count(1) total from company_product_try_out_update_log a join company_product b on a.company_id=b.company_id and a.product_id=b.product_id where a.company_id = ? `
	pars = append(pars, companyId)

	//如果有传入产品id，那么只查询该类型下的产品
	if productId != 0 {
		sql += ` and a.product_id = ? `
		pars = append(pars, productId)
	}
	err = o.Raw(sql, pars...).QueryRow(&total)
	return
}

// GetCompanyProductTryOutUpdateLogList 获取客户转试用的记录列表
func GetCompanyProductTryOutUpdateLogList(companyId, productId, startSize, pageSize int) (items []*CompanyProductTryOutUpdateLog, err error) {
	o := orm.NewOrm()
	var pars []interface{}
	sql := `select a.* from company_product_try_out_update_log a join company_product b on a.company_id=b.company_id and a.product_id=b.product_id where a.company_id = ? `
	pars = append(pars, companyId)

	//如果有传入产品id，那么只查询该类型下的产品
	if productId != 0 {
		sql += ` and a.product_id = ? `
		pars = append(pars, productId)
	}
	sql += ` order by a.create_time desc  LIMIT ?,? `
	pars = append(pars, startSize, pageSize)
	_, err = o.Raw(sql, pars...).QueryRows(&items)
	return
}

// GetCompanyProductTryOutPermissionUpdateNoStopListByEndDate 获取当前正在进行中的客户变更试用品种的数据（未停止的）
func GetCompanyProductTryOutPermissionUpdateNoStopListByEndDate(companyProductUpdateLogId int) (items []*CompanyProductTryOutUpdatePermissionLog, err error) {
	o := orm.NewOrm()
	sql := ` select * from company_product_try_out_update_permission_log Where company_product_update_log_id=? AND is_stop=0 order by end_date desc;`
	_, err = o.Raw(sql, companyProductUpdateLogId).QueryRows(&items)
	return
}
