package forms

import (
	"github.com/tidbcloud/account/internel/dao/entity"
)

type Tenant struct {
	ID                        uint64 `json:"id,string"`
	Name                      string `json:"name"`
	Alias                     string `json:"alias"`
	Timezone                  int32  `json:"timezone"`
	Email                     string `json:"email"`
	Status                    string `json:"status"`
	Plan                      string `json:"plan,omitempty"`
	Discount                  int64  `json:"discount,omitempty"`
	DiscountDescription       string `json:"discount_description,omitempty"`
	TotalCredit               int64  `json:"total_credit,omitempty"`
	RemainingCredit           int64  `json:"remaining_credit,omitempty"`
	Country                   string `json:"country,omitempty"`
	HasDiscount               bool   `json:"has_discount,omitempty"`
	CreatedAt                 int64  `json:"created_at"`
	Kind                      string `json:"kind,omitempty"`
	AccountManager            string `json:"account_manager,omitempty"`
	ThirdPartyAccountProvider string `json:"third_party_account_provider"`
	ThirdPartyAccountCode     string `json:"third_party_account_code"`
	OrgTag                    string `json:"org_tag"`
	OrgType                   string `json:"org_type"`
}

type TenantFilter struct {
	ID     *uint64  `form:"id" json:"id"`
	Plan   []string `form:"plan" json:"plan" binding:"dive,oneof=new_user free_trial poc on_demand"`
	Kind   []string `form:"kind" json:"kind" binding:"dive,oneof=internal external"`
	Name   *string  `form:"name" json:"name"`
	Alias  *string  `form:"alias" json:"alias"`
	Email  *string  `form:"email" json:"email"`
	Status []string `form:"status" json:"status" binding:"dive,oneof=pending active inactive deleted cleared"`
	//OrgTag *string  `form:"org_tag" json:"org_tags" binding:"dive,oneof=msp msp_customer"`
	OrgTag *string `form:"org_tag" json:"org_tag"`
}

type ListTenant struct {
	TenantFilter
	Search  *string `form:"search" json:"search" binding:"omitempty"`
	SortBy  string  `form:"sort_by" json:"sort_by" binding:"omitempty,oneof=timezone created_at"` // options: timezone, created_at
	Order   string  `form:"order" json:"order"`                                                   // options: asc or desc
	NoLimit bool    `form:"no-limit,default=false" json:"no_limit"`
	Brief   bool    `form:"brief" json:"brief"`
}

type CentralUserFilter struct {
	Email *string `form:"email" json:"email"`
}

type ListCentralUser struct {
	CentralUserFilter
}

type ListCentralUsersResp struct {
	Total int64         `json:"total"`
	Items []CentralUser `json:"items"`
}

type ListRolesResp struct {
	Total int64  `json:"total"`
	Items []Role `json:"items"`
}

type ListTenantResp struct {
	Total int64    `json:"total"`
	Items []Tenant `json:"items"`
}

type PatchTenantReq struct {
	Kind           *string `json:"kind" binding:"omitempty,oneof=internal external"`
	Alias          *string `json:"alias"`
	AccountManager *string `json:"account_manager" binding:"omitempty,email,endswith=@pingcap.com"` // the email address of account manager, must end with @pingcap.com
	Email          *string `form:"email" json:"email"`

	Status *entity.TenantStatus `form:"status" json:"status" binding:"omitempty,oneof=pending active inactive deleted cleared"`

	ThirdPartyFreeTrial               *bool   `form:"third_party_free_trial"  json:"third_party_free_trial"`
	ThirdPartyAccountProvider         *string `form:"third_party_account_provider"  json:"third_party_account_provider"`
	IsUpdateThirdPartyAccountProvider *bool   `form:"is_update_third_party_account_provider"  json:"is_update_third_party_account_provider"`
	ThirdPartyAccountCode             *string `form:"third_party_account_code"  json:"third_party_account_code"`
	IsUpdateThirdPartyAccountCode     *bool   `form:"is_update_third_party_account_code"  json:"is_update_third_party_account_code"`
	OrgTag                            *string `form:"org_tag" json:"org_tag" binding:"omitempty,oneof=personal enterprise"`
	OrgType                           *string `form:"org_type" json:"org_type"`
}

type GetUserOrgsReq struct {
	UserId uint64 `form:"user_id" json:"user_id"`
}

type GetUserOrgsResp struct {
	Orgs []Tenant `json:"orgs"`
}

type ResourceResult struct {
	ClusterNum     uint64 `json:"cluster_num"`
	BackupNUm      uint64 `json:"backup_num"`
	VPCPeeringNum  uint64 `json:"vpc_peering_num"`
	IsHaveResource bool   `json:"is_have_resource"`
	ResourcesMsg   string `json:"resources_msg"`
}
