package v1

import (
	"database/sql"
	"encoding/json"
	"time"

	"gorm.io/gorm"
)

type User struct {
	ID               uint64          `json:"id" gorm:"primary_key;AUTO_INCREMENT;column:id"`
	AuthingID        string          `json:"authingID" gorm:"unique;column:authingID;type:varchar(128)"`
	LarkUserID       string          `json:"larkUserID" gorm:"unique;column:larkUserID;type:varchar(128)"`
	MainDepartmentID string          `json:"mainDepartmentID" gorm:"unique;column:mainDepartmentID;type:varchar(128)"`
	CreatedAt        time.Time       `json:"createdAt" gorm:"column:createdAt"`
	UpdatedAt        sql.NullTime    `json:"updatedAt" gorm:"column:updatedAt"`
	DeletedAt        gorm.DeletedAt  `json:"deletedAt" gorm:"column:deletedAt"`
	SyncedAt         time.Time       `json:"syncedAt" gorm:"column:syncedAt"`
	Name             string          `json:"name" gorm:"column:name"`
	EnName           string          `json:"enName" gorm:"column:enName"`
	Avatars          json.RawMessage `json:"avatars" gorm:"column:avatars"`
	Email            string          `json:"email" gorm:"column:email"`
	LarkOpenID       string          `json:"larkOpenID" gorm:"column:larkOpenID"`
	AwsPID           string          `json:"awsPID" gorm:"column:awsPID"`
	AzureObjectID    string          `json:"azureObjectID" gorm:"column:azureObjectID"`
}

func (u *User) TableName() string {
	return "user"
}

// @api:GetUserInfo:params.
type GetUserInfoParams struct {
	// lark user id
	Luid string `json:"luid"`
}

type UserMark struct {
	Key     string `json:"key"`
	BoolVal bool   `json:"boolVal"`
}

// @api:GetUserInfo:data.
type GetUserInfoData struct {
	// user id in lark
	LarkUserId string `json:"larkUserId"`
	// username
	Name string `json:"name"`
	// user en name
	EnName string `json:"enName"`
	// user email
	Email string `json:"email"`
	// user avatar urls with different sizes (from lark)
	Avatar *AvatarLark `json:"avatar"`
	// user departments
	Departments *[]Department `json:"departments"`
	// marks
	Marks *[]UserMark `json:"marks"`
	// permissions
	Permissions *[]PCHPermission `json:"permissions"`
}

type AvatarLark struct {
	Avatar72     string `json:"avatar_72,omitempty"`
	Avatar240    string `json:"avatar_240,omitempty"`
	Avatar640    string `json:"avatar_640,omitempty"`
	AvatarOrigin string `json:"avatar_origin,omitempty"`
}
