package dao

import (
	"context"

	"go-common/app/admin/main/manager/model"
)

// AddCateSecExt .
func (d *Dao) AddCateSecExt(c context.Context, e *model.CateSecExt) (err error) {
	str := "INSERT INTO manager_reason_catesecext (bid,name,type) VALUES (?,?,?) ON DUPLICATE KEY UPDATE bid=values(bid),name=values(name),type=values(type)"
	return d.db.Exec(str, e.BusinessID, e.Name, e.Type).Error
}

// UpdateCateSecExt .
func (d *Dao) UpdateCateSecExt(c context.Context, e *model.CateSecExt) (err error) {
	return d.db.Table("manager_reason_catesecext").Where("id = ?", e.ID).Update("name", e.Name).Error
}

// BanCateSecExt .
func (d *Dao) BanCateSecExt(c context.Context, e *model.CateSecExt) (err error) {
	return d.db.Table("manager_reason_catesecext").Where("id = ?", e.ID).Update("state", e.State).Error
}

// AddAssociation .
func (d *Dao) AddAssociation(c context.Context, e *model.Association) (err error) {
	return d.db.Table("manager_reason_association").Create(&e).Error
}

// UpdateAssociation .
func (d *Dao) UpdateAssociation(c context.Context, e *model.Association) (err error) {
	return d.db.Table("manager_reason_association").Where("id = ?", e.ID).Updates(
		map[string]interface{}{
			"rid":  e.RoleID,
			"cid":  e.CategoryID,
			"sids": e.SecondIDs,
		}).Error
}

// BanAssociation .
func (d *Dao) BanAssociation(c context.Context, e *model.Association) (err error) {
	return d.db.Table("manager_reason_association").Where("id = ?", e.ID).Update("state", e.State).Error
}

// AddReason .
func (d *Dao) AddReason(c context.Context, e *model.Reason) (err error) {
	return d.db.Table("manager_reason").Create(e).Error
}

// UpdateReason .
func (d *Dao) UpdateReason(c context.Context, e *model.Reason) (err error) {
	return d.db.Table("manager_reason").Where("id = ?", e.ID).
		Updates(map[string]interface{}{
			"rid":         e.RoleID,
			"cid":         e.CategoryID,
			"sid":         e.SecondID,
			"state":       e.State,
			"common":      e.Common,
			"uid":         e.UID,
			"description": e.Description,
			"weight":      e.Weight,
			"flag":        e.Flag,
			"lid":         e.LinkID,
			"type_id":     e.TypeID,
			"tid":         e.TagID,
		}).Error
}

// ReasonList .
func (d *Dao) ReasonList(c context.Context, e *model.SearchReasonParams) (res []*model.Reason, err error) {
	db := d.db.Table("manager_reason")
	if e.BusinessID != -1 {
		db = db.Where("bid = ?", e.BusinessID)
	}
	if e.KeyWord != "" {
		db = db.Where("description LIKE ?", "%"+e.KeyWord+"%")
	}
	if e.RoleID != 0 {
		db = db.Where("rid = ?", e.RoleID)
	}
	if e.CategoryID != 0 {
		db = db.Where("cid = ?", e.CategoryID)
	}
	if e.SecondID != 0 {
		db = db.Where("sid = ?", e.SecondID)
	}
	if e.State != -1 {
		db = db.Where("state = ?", e.State)
	}
	if e.UName != "" {
		db = db.Where("uid = ?", e.UID)
	}
	if e.Order != "" {
		db = db.Order(e.Order+" "+e.Sort, true)
	}
	err = db.Find(&res).Error
	return
}

// CateSecByIDs .
func (d *Dao) CateSecByIDs(c context.Context, ids []int64) (res map[int64]string, err error) {
	r := []*model.CateSecExt{}
	res = make(map[int64]string)
	if err = d.db.Table("manager_reason_catesecext").Where("id IN (?)", ids).Find(&r).Error; err != nil {
		return
	}
	for _, cn := range r {
		res[cn.ID] = cn.Name
	}
	return
}

// BatchUpdateReasonState .
func (d *Dao) BatchUpdateReasonState(c context.Context, b *model.BatchUpdateReasonState) (err error) {
	return d.db.Table("manager_reason").Where("id IN (?)", b.IDs).Update("state", b.State).Error
}

// CateSecExtList .
func (d *Dao) CateSecExtList(c context.Context, e *model.CateSecExt) (res []*model.CateSecExt, err error) {
	// Display all record
	db := d.db.Table("manager_reason_catesecext").Where("bid = ? and type = ?", e.BusinessID, e.Type)
	if e.State != -1 {
		db = db.Where("state = ?", e.State)
	}
	err = db.Find(&res).Error
	return
}

// CateSecList .
func (d *Dao) CateSecList(c context.Context, bid int64) (res []*model.CateSecExt, err error) {
	err = d.db.Table("manager_reason_catesecext").Where("bid = ?", bid).Find(&res).Error
	return
}

// AssociationList .
func (d *Dao) AssociationList(c context.Context, state int64, bid int64) (res []*model.Association, err error) {
	db := d.db.Table("manager_reason_association").Where("bid = ?", bid)
	if state != -1 {
		db = db.Where("state = ?", state)
	}
	err = db.Find(&res).Error
	return
}