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

// DepartmentApprovalSetting 部门抄送人设置
type DepartmentApprovalSetting 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"`       // 更新时间
	DepartmentID uint64                `gorm:"column:department_id" json:"departmentId"` // 绑定的部门ID
	CopyUsers    CopyUsers             `gorm:"column:copy_users" json:"copyUsers"`       // 抄送人
	ApproverID   uint64                `gorm:"column:approver_id" json:"approverId"`     // 审批人ID
	ApproverName string                `gorm:"column:approver_name" json:"approverName"` // 审批人名称
	Domain       string                `gorm:"column:domain" json:"domain"`              // 环境env
}

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

type JSON json.RawMessage

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 FormatCopyUsers(copyUsers []*approval.CopyUser) CopyUsers {
	var res CopyUsers

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

	return res
}

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
}

// DepartmentApprovalSettingColumns get sql column name.获取数据库列名
var DepartmentApprovalSettingColumns = struct {
	ID           string
	DeletedAt    string
	CreatedAt    string
	UpdatedAt    string
	DepartmentID string
	CopyUsers    string
	ApproverID   string
	ApproverName string
	Domain       string
}{
	ID:           "id",
	DeletedAt:    "deleted_at",
	CreatedAt:    "created_at",
	UpdatedAt:    "updated_at",
	DepartmentID: "department_id",
	CopyUsers:    "copy_users",
	ApproverID:   "approver_id",
	ApproverName: "approver_name",
	Domain:       "domain",
}