package model

import (
	"database/sql/driver"
	"encoding/json"
	"github.com/fonchain_enterprise/fonchain-approval/api/approval"
	"gorm.io/plugin/soft_delete"
	"time"
)

type CopyUser struct {
	ID       uint64
	Name     string
	IsViewed bool
}

type CopyUsers []CopyUser

type ApprovalUser struct {
	ID   uint64
	Name string
}

type ApprovalUsers []ApprovalUser

// ApprovalSetting 部门抄送人设置
type ApprovalSetting struct {
	ID            uint64                `gorm:"primaryKey;column:id" json:"id"`     // ID
	DeletedAt     soft_delete.DeletedAt `gorm:"column:deleted_at" json:"deletedAt"` // 删除标记
	CreatedAt     time.Time             `gorm:"column:created_at" json:"createdAt"` // 创建时间
	UpdatedAt     time.Time             `gorm:"column:updated_at" json:"updatedAt"` // 更新时间
	KeyWord       string                `gorm:"column:key_word" json:"keyWord"`
	ApprovalUsers ApprovalUsers         `gorm:"column:approval_users" json:"approvalUsers"`
	CopyUsers     CopyUsers             `gorm:"column:copy_users" json:"copyUsers"`
	ApprovalType  *ApprovalType         `gorm:"foreignKey:key_word;references:key_word" json:"approvalType"`

	Domain string `gorm:"column:domain" json:"domain"`
}

// TableName get sql table name.获取数据库表名
func (m *ApprovalSetting) TableName() string {
	return "approval_setting"
}

func (j *CopyUsers) Scan(src interface{}) error {
	return json.Unmarshal(src.([]byte), j)
}

func (j CopyUsers) Value() (driver.Value, error) {

	v, err := json.Marshal(j)

	return string(v), err
}

func (s *ApprovalUsers) Scan(src interface{}) error {
	return json.Unmarshal(src.([]byte), s)
}

func (s ApprovalUsers) Value() (driver.Value, error) {

	v, err := json.Marshal(s)

	return string(v), err
}

func GetApprovalSettingFromKeyWord(Domain, keyWord string) (setting *ApprovalSetting, err error) {

	err = DB.Model(&ApprovalSetting{}).Where(&ApprovalSetting{KeyWord: keyWord, Domain: Domain}).First(&setting).Error

	return setting, err
}

func FormatCopyUsers(copyUsers []*approval.CopyUser) CopyUsers {
	var res CopyUsers
	copyMap := make(map[uint64]struct{})

	// copyer
	for _, copyUser := range copyUsers {

		if _, ok := copyMap[copyUser.ID]; ok { //存在
			continue
		}

		temp := CopyUser{
			ID:   copyUser.ID,
			Name: copyUser.Name,
		}

		res = append(res, temp)
	}

	return res
}

func FormatApproveUsers(copyUsers []*approval.ApprovalUser) ApprovalUsers {
	var res ApprovalUsers

	// copyer
	for _, copyUser := range copyUsers {
		temp := ApprovalUser{
			ID:   copyUser.ID,
			Name: copyUser.Name,
		}
		res = append(res, temp)
	}

	return res
}

//GetCombineApproveUsers 混合获取
func (m *ApprovalSetting) GetCombineApproveUsers(approvalUser []ApprovalUser) []ApprovalUser {
	approvalUserMap := make(map[uint64]struct{})

	// copyer
	for _, tt := range approvalUser {
		if _, ok := approvalUserMap[tt.ID]; ok == false {
			approvalUserMap[tt.ID] = struct{}{}
		}
	}

	for _, tt := range m.ApprovalUsers {
		if _, ok := approvalUserMap[tt.ID]; ok == false {
			approvalUserMap[tt.ID] = struct{}{}
			approvalUser = append(approvalUser, tt)
		}
	}

	return approvalUser
}

func FormatToResponse(copyUsers CopyUsers) []*approval.CopyUser {
	var res []*approval.CopyUser

	for _, copyUser := range copyUsers {
		temp := &approval.CopyUser{
			ID:       copyUser.ID,
			Name:     copyUser.Name,
			IsViewed: copyUser.IsViewed,
		}

		res = append(res, temp)
	}

	return res
}