package company

import (
	"errors"
	"github.com/beego/beego/v2/client/orm"
	"hongze/hz_crm_api/utils"
	"time"
)

// 申请服务更新请求参数
type CompanyApplyServiceUpdateReq struct {
	CompanyId         int     `description:"客户id"`
	CompanyApprovalId int     `description:"申请单id,没有传0"`
	ContractType      string  `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
	CompanyType       string  `description:"客户类型,ficc/权益"`
	StartDate         string  `description:"合同开始日期"`
	EndDate           string  `description:"合同结束日期"`
	Money             float64 `description:"合同金额"`
	PayMethod         string  `description:"付款方式"`
	PayChannel        string  `description:"付款渠道"`
	PermissionIds     string  `description:"权限id,多个用英文逗号隔开"`
	ImgUrl            string  `description:"合同图片,多个用英文#隔开"`
	PackageType       int     `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
	RaiPackageType    int     `description:"权益套餐类型: 0-无; 1-70w套餐; 2-45w套餐"`
}

type ApproveUser struct {
	AdminId  int
	RealName string
	Mobile   string
}

// 获取审批人
func GetApproveUser(roleTypeCode string) (items []*ApproveUser, err error) {
	o := orm.NewOrm()
	sql := `SELECT admin_id,real_name,mobile FROM admin WHERE role_type_code=? AND admin_name<>'qshi' `
	_, err = o.Raw(sql, roleTypeCode).QueryRows(&items)
	return
}

type CompanyContractHistory struct {
	CompanyContractId int       `json:"-" description:"合同id"`
	CompanyId         int       `description:"客户id"`
	ContractCode      string    `description:"合同编码"`
	ContractType      string    `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
	StartDate         string    `description:"合同开始时间"`
	EndDate           string    `description:"合同结束时间"`
	Money             float64   `description:"合同金额"`
	PayMethod         string    `description:"支付方式"`
	PayChannel        string    `description:"支付渠道"`
	ImgUrl            string    `description:"合同图片,多个用#隔开"`
	CreateTime        time.Time `description:"合同创建时间"`
	ModifyTime        time.Time `description:"合同修改时间";json:"-"`
	ModifyTimeStr     string    `description:"合同修改时间"`
	Status            int       `description:"状态"`
	ProductId         int       `description:"产品id"`
	ContractId        int       `description:"合同ID"`
	PermissionList    []*ContractPermissionList
}

type CompanyContractHistoryResp struct {
	List []*CompanyContractHistory
}

func GetCompanyContractHistoryList(companyId int, productId string) (items []*CompanyContractHistory, err error) {
	o := orm.NewOrm()
	//sql := `SELECT * FROM company_contract WHERE company_id=? AND product_id IN(` + productId + `) AND status="1" ORDER BY modify_time DESC `
	sql := `SELECT
				a.*,
				b.contract_id
			FROM
				company_contract AS a
			LEFT JOIN contract AS b ON a.contract_code = b.contract_code
			WHERE
				a.company_id = ? AND a.product_id IN (` + productId + `) AND a.status = 1
			ORDER BY
				a.modify_time DESC`
	_, err = o.Raw(sql, companyId).QueryRows(&items)
	return
}

func GetCompanyContractHistoryListByContractCode(contractCode string) (items []*CompanyContractHistory, err error) {
	o := orm.NewOrm()
	sql := `SELECT
				a.*,
				b.contract_id
			FROM
				company_contract AS a
			LEFT JOIN contract AS b ON a.contract_code = b.contract_code
			WHERE
				a.contract_code = ?  AND a.status = 1
			ORDER BY
				a.modify_time DESC`
	_, err = o.Raw(sql, contractCode).QueryRows(&items)
	return
}

type CompanyContractDetail struct {
	CompanyContractId int
	CompanyId         int       `description:"客户id"`
	ProductId         int       `description:"产品id"`
	ContractCode      string    `description:"合同编码"`
	ContractType      string    `description:"合同类型:枚举值:'新签合同','续约合同','补充协议'"`
	StartDate         string    `description:"合同开始时间"`
	EndDate           string    `description:"合同结束时间"`
	Money             float64   `description:"合同金额"`
	PayMethod         string    `description:"支付方式"`
	PayChannel        string    `description:"支付渠道"`
	ImgUrl            string    `description:"合同图片,多个用#隔开"`
	CreateTime        time.Time `description:"合同创建时间"`
	ModifyTime        time.Time `description:"合同修改时间"`
	Status            int       `description:"状态"`
	PackageType       int       `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
	RaiPackageType    int       `description:"权益套餐类型: 0-无; 1-70w套餐; 2-45w套餐"`
	Source            string    `description:"合同来源:上传附件, 系统合同"`
	SourceTag         string    `description:"合同来源标签:非标合同,标准合同"`
	PermissionList    []*PermissionLookList
}

type CompanyContractDetailResp struct {
	Item *CompanyContractDetail
}

func GetCompanyContractDetail(companyId, productId, companyContractId int) (item *CompanyContractDetail, err error) {
	o := orm.NewOrm()
	if companyContractId == 0 {
		if productId <= 0 {
			err = errors.New("客户类型异常")
		}
		sql := `SELECT * FROM company_contract WHERE company_id=? AND product_id=? AND status=0 `
		err = o.Raw(sql, companyId, productId).QueryRow(&item)
	} else {
		sql := `SELECT * FROM company_contract WHERE company_contract_id=? `
		err = o.Raw(sql, companyContractId).QueryRow(&item)
	}
	return
}

// 获取客户大于今天的最后一份有效合同
func GetCompanyLastContractDetail(companyId, productId int) (item *CompanyContractDetail, err error) {
	o := orm.NewOrm()
	endDate := utils.GetToday(utils.FormatDate)
	sql := `SELECT * FROM company_contract WHERE company_id=? AND product_id=? AND status=1 AND end_date >= ? AND contract_type in ("新签合同","续约合同") order by end_date desc limit 1`
	err = o.Raw(sql, companyId, productId, endDate).QueryRow(&item)
	return
}

// 最后一次
type ContractPermissionLookItemRes struct {
	ChartPermissionId int       `description:"权限id"`
	PermissionName    string    `description:"权限名称"`
	StartDate         time.Time `description:"权限开始日期"`
	EndDate           time.Time `description:"权限结束日期"`
	//Status            string `description:"'正式','试用','关闭'"`
	//ExpireDay         string `description:"到期天数"`
	ClassifyName string `description:"分类"`
}

// 获取客户大于今天的所有有效合同
func GetCompanyWillContractList(companyId, productId int) (list []*CompanyContractDetail, err error) {
	o := orm.NewOrm()
	endDate := utils.GetToday(utils.FormatDate)
	sql := `SELECT * FROM company_contract WHERE company_id=? AND product_id=? AND status=1 AND end_date >= ? AND contract_type in ("新签合同","续约合同") order by end_date desc`
	_, err = o.Raw(sql, companyId, productId, endDate).QueryRows(&list)
	return
}

func GetCompanyContractApproveCount(companyId, productId int) (count int, err error) {
	o := orm.NewOrm()
	sql := `SELECT COUNT(1) AS count FROM company_contract WHERE company_id=? AND product_id=? AND status=0 `
	err = o.Raw(sql, companyId, productId).QueryRow(&count)
	return
}

type CompanyApplyApproveReq struct {
	CompanyId         int    `description:"客户id"`
	Status            int    `description:"审批状态,1:通过,2:拒绝"`
	Remark            string `description:"审批理由"`
	CompanyContractId int    `description:"合同id"`
	ProductId         int    `description:"客户产品id"`
}

// 审批通过
func ApproveAgree(companyId, productId int, approveStatus, approveRemark, startDate, endDate string, applyMethod int) (err error) {
	o := orm.NewOrm()
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()
	sql := `UPDATE  company_product
			SET
			  approve_status = ?,
			  approve_time = NOW(),
			  approve_remark = ?,
			  start_date=?,
			  end_date=?,
			  modify_time=NOW()
			WHERE company_id = ? AND product_id=? `
	_, err = to.Raw(sql, approveStatus, approveRemark, startDate, endDate, companyId, productId).Exec()
	if err != nil {
		return
	}
	if applyMethod == 6 {
		sql := `UPDATE  company_contract
			SET
			  status = 1,
			  modify_time=NOW()
			WHERE company_id = ? AND product_id=? `
		_, err = to.Raw(sql, companyId, productId).Exec()
	}
	return
}

// 审批拒绝
func ApproveRefuse(companyId, productId int, approveStatus, approveRemark string) (err error) {
	o := orm.NewOrm()
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()
	sql := `UPDATE  company_product
			SET
			  approve_status = '驳回',
			  modify_time=NOW()
			WHERE company_id = ? AND product_id=? `
	_, err = to.Raw(sql, companyId, productId).Exec()
	if err != nil {
		return
	}
	sql = ` UPDATE  company_approval
			SET
			  approve_status = '驳回',
			  approve_remark=?,
			  approve_time=NOW(),
			  modify_time=NOW()
			WHERE company_id = ? AND product_id=? AND approve_status='待审批' `
	_, err = to.Raw(sql, approveRemark, companyId, productId).Exec()
	return
}

// 申请转正请求参数
type CompanyApplyTurnPositiveReq struct {
	CompanyId         int
	CompanyApprovalId int     `description:"申请单id,没有传0"`
	ContractType      string  `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
	StartDate         string  `description:"合同开始日期"`
	EndDate           string  `description:"合同结束日期"`
	Money             float64 `description:"合同金额"`
	PayMethod         string  `description:"付款方式"`
	PayChannel        string  `description:"付款渠道"`
	PermissionIds     string  `description:"权限id,多个用英文逗号隔开"`
	PermissionNames   string  `description:"权限名称,多个用英文逗号隔开"`
	ImgUrl            string  `description:"合同图片,多个用英文#隔开"`
	PackageType       int     `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
	RaiPackageType    int     `description:"权益套餐类型: 0-无; 1-70w大套餐; 2-45w大套餐"`
}

// 申请转正请求参数
type CompanyApplyBySystemContractReq struct {
	CompanyId         int
	CompanyApprovalId int `description:"申请单id,没有传0"`
	ContractId        int `description:"合同id,没有传0"`
}

// 申请解冻参数
type CompanyApplyThawReq struct {
	CompanyId         int    `description:"客户id"`
	CompanyApprovalId int    `description:"申请单id,没有传0"`
	ApplyRemark       string `description:"申请解冻理由"`
	PermissionIds     string `description:"权限id,多个用英文逗号隔开"`
}

// 申请延期参数
type CompanyApplyDelayReq struct {
	CompanyId         int    `description:"客户id"`
	CompanyApprovalId int    `description:"申请单id,没有传0"`
	ApplyRemark       string `description:"申请解冻理由"`
	PermissionIds     string `description:"权限id,多个用英文逗号隔开"`
}

// 申请领取参数
type CompanyApplyReceiveReq struct {
	CompanyId         int    `description:"客户id"`
	CompanyApprovalId int    `description:"申请单id,没有传0"`
	ApplyRemark       string `description:"申请解冻理由"`
	PermissionIds     string `description:"权限id,多个用英文逗号隔开"`
}

type CompanyApplyDetailResp struct {
	Item        *CompanyDetail        `description:"客户信息"`
	FiccItem    *CompanyProductDetail `description:"Ficc客户产品详情"`
	RaiItem     *CompanyProductDetail `description:"权益客户产品详情"`
	ProductName string                `description:"部门名称:ficc/权益/admin"`
	Approval    *CompanyApproval      `description:"审批详情"`
}

type CompanyApplyRevokeReq struct {
	CompanyId int `description:"客户id"`
}

func ApplyRevoke(companyApprovalId, companyId, productId int) (err error) {
	o := orm.NewOrm()
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()
	sql := `UPDATE company_approval SET approve_status='已撤回' WHERE company_approval_id=? `
	_, err = to.Raw(sql, companyApprovalId).Exec()
	sql = `UPDATE company_product SET approve_status='已撤回' WHERE company_id=? AND product_id=? `
	_, err = to.Raw(sql, companyId, productId).Exec()
	sql = `UPDATE company_approval_message SET operation_status=2 WHERE company_approval_id=? AND operation_status=1 `
	_, err = to.Raw(sql, companyApprovalId).Exec()

	return
}

func GetCompanyApprovalByCompanyApprovalId(companyApprovalId int) (item *CompanyApproval, err error) {
	sql := `SELECT * FROM company_approval WHERE company_approval_id=? `
	o := orm.NewOrm()
	err = o.Raw(sql, companyApprovalId).QueryRow(&item)
	return
}

func GetCompanyContractById(companyContractId int) (item *CompanyContractDetail, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM company_contract WHERE company_contract_id=? `
	err = o.Raw(sql, companyContractId).QueryRow(&item)
	return
}

type ApplyContractResp struct {
	Item *CompanyContractDetail
}

// 获取申请转正时的合同类型
type ApplyContractTypeResp struct {
	ContractType string
}