// Package host 定义 user-service 内 host/Agency/BD 领域事实。
package host

const (
	// HostStatusActive 表示用户已经拥有长期主播身份。
	HostStatusActive = "active"
	// HostStatusDisabled 表示主播身份被独立的身份管理流程停用；解除 Agency 成员关系不会改变该状态。
	HostStatusDisabled = "disabled"

	// HostSourceApplication 表示主播身份来自 Agency 申请审核通过。
	HostSourceApplication = "agency_application"
	// HostSourceAgencyInvitation 表示主播身份来自接受 Agency 邀请并成为 Agency owner。
	HostSourceAgencyInvitation = "agency_invitation"
	// HostSourceHostInvitation 表示主播身份来自 Agency owner 邀请加入，本身不具备 Agency owner 身份。
	HostSourceHostInvitation = "host_invitation"
	// HostSourceAdminCreateAgency 表示主播身份来自后台直接创建 Agency。
	HostSourceAdminCreateAgency = "admin_create_agency"
	// HostSourceAdminAddHost 表示主播身份来自后台直接添加到 Agency。
	HostSourceAdminAddHost = "admin_add_host"

	// AgencyStatusActive 表示 Agency 可参与搜索、邀请和归属。
	AgencyStatusActive = "active"
	// AgencyStatusClosed 表示 Agency 已关闭，历史关系仍保留。
	AgencyStatusClosed = "closed"
	// AgencyStatusDeleted 表示后台删除 Agency 身份；主播身份保留，当前 Agency 归属会被解除。
	AgencyStatusDeleted = "deleted"

	// BDStatusActive 表示 BD 或 BD Leader 可邀请下级角色。
	BDStatusActive = "active"
	// BDStatusDisabled 表示 BD 或 BD Leader 已停用。
	BDStatusDisabled = "disabled"

	// ManagerStatusActive 表示经理身份有效，可以进入经理中心并邀请 BD Leader/Admin。
	ManagerStatusActive = "active"
	// ManagerStatusDisabled 表示经理身份已停用，不能继续使用经理中心能力。
	ManagerStatusDisabled = "disabled"

	// BDRoleBD 是普通拓展角色。
	BDRoleBD = "bd"
	// BDRoleLeader 是 BD Leader，具备邀请 BD 的能力；它与普通 BD 身份分表保存。
	BDRoleLeader = "bd_leader"

	// CoinSellerStatusActive 表示币商身份有效，可以使用币商金币账户转账能力。
	CoinSellerStatusActive = "active"
	// CoinSellerStatusDisabled 表示币商身份被后台停用，不能继续发起币商转账。
	CoinSellerStatusDisabled = "disabled"
	// CoinSellerMerchantAssetType 是币商专用金币资产，不和玩家普通 COIN 混账。
	CoinSellerMerchantAssetType = "COIN_SELLER_COIN"
	// CoinSellerRelationStatusActive 表示父子币商直属关系有效，H5 转账只能命中 active 关系。
	CoinSellerRelationStatusActive = "active"
	// CoinSellerRelationStatusDisabled 表示历史关系已停用，保留审计但不能继续转账。
	CoinSellerRelationStatusDisabled = "disabled"

	// MembershipTypeOwner 表示 Agency owner 自动拥有的 membership。
	MembershipTypeOwner = "owner"
	// MembershipTypeMember 表示普通主播加入 Agency 的 membership。
	MembershipTypeMember = "member"

	// MembershipStatusActive 表示当前有效 Agency 归属。
	MembershipStatusActive = "active"
	// MembershipStatusEnded 表示历史 Agency 归属。
	MembershipStatusEnded = "ended"

	// ApplicationStatusPending 表示等待 Agency 审核。
	ApplicationStatusPending = "pending"
	// ApplicationStatusApproved 表示申请已通过并创建关系事实。
	ApplicationStatusApproved = "approved"
	// ApplicationStatusRejected 表示申请被拒绝，不创建主播身份。
	ApplicationStatusRejected = "rejected"
	// ApplicationStatusCancelled 表示申请被申请人取消。
	ApplicationStatusCancelled = "cancelled"
	// ApplicationStatusExpired 表示申请已过期。
	ApplicationStatusExpired = "expired"

	// ApplicationDecisionApprove 是审核通过动作。
	ApplicationDecisionApprove = "approve"
	// ApplicationDecisionReject 是审核拒绝动作。
	ApplicationDecisionReject = "reject"

	// InvitationTypeAgency 表示邀请用户成为 Agency owner。
	InvitationTypeAgency = "agency"
	// InvitationTypeBD 表示邀请用户成为 BD。
	InvitationTypeBD = "bd"
	// InvitationTypeHost 表示 Agency owner 邀请用户成为本 Agency 的 Host 成员。
	InvitationTypeHost = "host"
	// InvitationTypeExternalAgency 是外管平台专用的 Agency 邀请类型。
	// 它不能复用普通 Agency 类型，否则旧 App 邀请的 pending 唯一键和接受分支会被外管元数据改变。
	InvitationTypeExternalAgency = "external_agency"
	// InvitationTypeExternalBD 是外管平台专用的 BD 邀请类型。
	InvitationTypeExternalBD = "external_bd"
	// InvitationTypeExternalHost 是外管平台专用的 Host 邀请类型。
	InvitationTypeExternalHost = "external_host"

	// InvitationStatusPending 表示等待目标用户处理。
	InvitationStatusPending = "pending"
	// InvitationStatusAccepted 表示目标用户接受并创建角色事实。
	InvitationStatusAccepted = "accepted"
	// InvitationStatusRejected 表示目标用户拒绝。
	InvitationStatusRejected = "rejected"
	// InvitationStatusCancelled 表示邀请人取消。
	InvitationStatusCancelled = "cancelled"
	// InvitationStatusExpired 表示邀请已过期。
	InvitationStatusExpired = "expired"

	// InvitationActionAccept 是接受邀请动作。
	InvitationActionAccept = "accept"
	// InvitationActionReject 是拒绝邀请动作。
	InvitationActionReject = "reject"
	// InvitationActionCancel 是邀请人取消动作。
	InvitationActionCancel = "cancel"

	// CommandTypeApplyToAgency 记录用户申请命令。
	CommandTypeApplyToAgency = "apply_to_agency"
	// CommandTypeReviewAgencyApplication 记录申请审核命令。
	CommandTypeReviewAgencyApplication = "review_agency_application"
	// CommandTypeKickAgencyHost 记录 Agency 踢出命令。
	CommandTypeKickAgencyHost = "kick_agency_host"
	// CommandTypeInviteAgency 记录 Agency 邀请命令。
	CommandTypeInviteAgency = "invite_agency"
	// CommandTypeInviteBD 记录 BD 邀请命令。
	CommandTypeInviteBD = "invite_bd"
	// CommandTypeInviteHost 记录 Agency owner 邀请 Host 加入团队的命令。
	CommandTypeInviteHost = "invite_host"
	// CommandTypeExternalInviteAgency 记录外管操作者为指定 BD 创建 Agency 邀请的命令。
	CommandTypeExternalInviteAgency = "external_invite_agency"
	// CommandTypeExternalInviteBD 记录外管操作者直接发展 BD 的命令。
	CommandTypeExternalInviteBD = "external_invite_bd"
	// CommandTypeExternalInviteHost 记录外管操作者为指定 Agency 创建 Host 邀请的命令。
	CommandTypeExternalInviteHost = "external_invite_host"
	// CommandTypeProcessRoleInvitation 记录邀请处理命令。
	CommandTypeProcessRoleInvitation = "process_role_invitation"
	// CommandTypeCreateBDLeader 记录后台创建 BD Leader 命令。
	CommandTypeCreateBDLeader = "admin_create_bd_leader"
	// CommandTypeCreateBD 记录后台创建普通 BD 命令。
	CommandTypeCreateBD = "admin_create_bd"
	// CommandTypeSetBDStatus 记录后台停用或恢复 BD/BD Leader 命令。
	CommandTypeSetBDStatus = "admin_set_bd_status"
	// CommandTypeCreateAgency 记录后台直接创建 Agency 命令。
	CommandTypeCreateAgency = "admin_create_agency"
	// CommandTypeCloseAgency 记录后台关闭 Agency 命令。
	CommandTypeCloseAgency = "admin_close_agency"
	// CommandTypeSetAgencyStatus 记录后台显式启用或关闭 Agency 命令。
	CommandTypeSetAgencyStatus = "admin_set_agency_status"
	// CommandTypeDeleteAgency 记录后台删除 Agency 身份命令。
	CommandTypeDeleteAgency = "admin_delete_agency"
	// CommandTypeSetAgencyJoinEnabled 记录后台设置 Agency 入会开关命令。
	CommandTypeSetAgencyJoinEnabled = "admin_set_agency_join_enabled"
	// CommandTypeUpdateAgencyProfile 记录 Agency owner 修改独立资料的命令。
	CommandTypeUpdateAgencyProfile = "update_agency_profile"
	// CommandTypeAdminAddAgencyHost 记录后台直接把用户添加为 Agency Host 的命令。
	CommandTypeAdminAddAgencyHost = "admin_add_agency_host"
	// CommandTypeCreateCoinSeller 记录后台创建币商身份命令。
	CommandTypeCreateCoinSeller = "admin_create_coin_seller"
	// CommandTypeSetCoinSellerStatus 记录后台启用或停用币商身份命令。
	CommandTypeSetCoinSellerStatus = "admin_set_coin_seller_status"
	// CommandTypeCreateSubCoinSeller 是历史直开子币商命令；审批制上线后不再允许新请求使用。
	CommandTypeCreateSubCoinSeller = "coin_seller_create_sub_seller"
	// CommandTypeSubmitSubCoinSellerApplication 记录父币商提交子币商审核申请的命令。
	CommandTypeSubmitSubCoinSellerApplication = "coin_seller_submit_sub_application"
	// CommandTypeReviewSubCoinSellerApplication 记录后台审核子币商申请的命令。
	CommandTypeReviewSubCoinSellerApplication = "admin_review_coin_seller_sub_application"

	// ResultTypeApplication 表示命令结果是 agency_applications 行。
	ResultTypeApplication = "agency_application"
	// ResultTypeMembership 表示命令结果是 agency_memberships 行。
	ResultTypeMembership = "agency_membership"
	// ResultTypeInvitation 表示命令结果是 role_invitations 行。
	ResultTypeInvitation = "role_invitation"
	// ResultTypeBDProfile 表示命令结果是普通 BD 或 BD Leader 身份行。
	ResultTypeBDProfile = "bd_profile"
	// ResultTypeAgency 表示命令结果是 agencies 行。
	ResultTypeAgency = "agency"
	// ResultTypeCoinSellerProfile 表示命令结果是 coin_seller_profiles 行。
	ResultTypeCoinSellerProfile = "coin_seller_profile"
	// ResultTypeCoinSellerRelation 表示命令结果是 coin_seller_relations 行。
	ResultTypeCoinSellerRelation = "coin_seller_relation"
	// ResultTypeCoinSellerSubApplication 表示命令结果是 coin_seller_sub_applications 行。
	ResultTypeCoinSellerSubApplication = "coin_seller_sub_application"
)

// HostProfile 是用户长期主播身份快照。
type HostProfile struct {
	UserID              int64
	Status              string
	RegionID            int64
	CurrentAgencyID     int64
	CurrentMembershipID int64
	// CurrentAgencyOwnerUserID 是当前 Agency 的 owner 用户 ID，供 wallet 在送礼时固化代理工资收款人。
	CurrentAgencyOwnerUserID int64
	Source                   string
	FirstBecameHostAtMs      int64
	CreatedAtMs              int64
	UpdatedAtMs              int64
}

// Agency 是主播组织事实，由一个用户拥有并归属于 BD。
type Agency struct {
	AgencyID        int64
	OwnerUserID     int64
	RegionID        int64
	ParentBDUserID  int64
	Name            string
	Avatar          string
	ActiveHostCount int32
	Status          string
	JoinEnabled     bool
	// MaxHosts 是历史字段，当前 Agency 不再限制主播数量，只保留数据库兼容读写。
	MaxHosts        int32
	CreatedByUserID int64
	CreatedAtMs     int64
	UpdatedAtMs     int64
}

// ManagerTeamAgency 是团队统计专用的轻量归属投影；刻意不复用 Agency，避免带出名称/成员数等重投影查询。
type ManagerTeamAgency struct {
	AgencyID       int64
	OwnerUserID    int64
	ParentBDUserID int64
}

// ManagerTeamAgencies 是经理整棵团队树的 Agency 统计投影：
// 经理 → BD Leader（created_by_user_id）→ BD（parent_leader_user_id）→ Agency（parent_bd_user_id）。
// 经理中心团队工资统计据此圈定主播归属范围，不承载写语义。
type ManagerTeamAgencies struct {
	Agencies       []ManagerTeamAgency
	TotalBDLeaders int
	TotalBDs       int
	// Truncated 表示团队规模超出查询上限被截断，调用方必须把统计视为不完整口径而不是静默当成全量。
	Truncated bool
}

// BDProfile 是 BD/BD Leader 角色事实。
type BDProfile struct {
	UserID             int64
	Role               string
	RegionID           int64
	ParentLeaderUserID int64
	// ParentOwnerUserID 只记录外管团队的直接 owner。
	// 普通 App BD 始终保持 0 并继续只使用 ParentLeaderUserID，避免改变既有 Manager/BD Leader 链路。
	ParentOwnerUserID int64
	Status            string
	CreatedByUserID   int64
	CreatedAtMs       int64
	UpdatedAtMs       int64
}

// ManagerProfile 是经理身份事实。
// 经理是 BD Leader/Admin 的上级，和 Host/Agency/BD 链路没有父子关系。
type ManagerProfile struct {
	UserID               int64
	RegionID             int64
	Status               string
	Contact              string
	CanGrantAvatarFrame  bool
	CanGrantVehicle      bool
	CanGrantBadge        bool
	CanGrantVIP          bool
	CanUpdateUserLevel   bool
	CanAddBDLeader       bool
	CanManageCrossRegion bool
	CanAddAdmin          bool
	CanAddSuperadmin     bool
	CanBlockUser         bool
	CanTransferCountry   bool
	CreatedByAdminID     int64
	CreatedAtMs          int64
	UpdatedAtMs          int64
}

// CoinSellerProfile 是币商角色事实，余额不保存在 user-service。
type CoinSellerProfile struct {
	UserID                  int64
	Status                  string
	MerchantAssetType       string
	CanManageSubCoinSellers bool
	CreatedByUserID         int64
	CreatedAtMs             int64
	UpdatedAtMs             int64
}

// CoinSellerListItem 是 App 充值入口需要的启用币商展示资料。
// 区域来自 users 当前事实，币商状态来自 coin_seller_profiles，不在 gateway 拼装。
type CoinSellerListItem struct {
	UserID                  int64
	DisplayUserID           string
	Username                string
	Avatar                  string
	CountryID               int64
	CountryCode             string
	CountryName             string
	CountryDisplayName      string
	RegionID                int64
	RegionCode              string
	RegionName              string
	Status                  string
	MerchantAssetType       string
	ContactInfo             string
	CanManageSubCoinSellers bool
	UpdatedAtMs             int64
}

// CoinSellerSubRelation 是父币商和直属子币商之间的状态事实。
type CoinSellerSubRelation struct {
	RelationID      int64
	ParentUserID    int64
	ChildUserID     int64
	Status          string
	CreatedByUserID int64
	CreatedAtMs     int64
	UpdatedAtMs     int64
}

const (
	CoinSellerSubApplicationStatusPending  = "pending"
	CoinSellerSubApplicationStatusApproved = "approved"
	CoinSellerSubApplicationStatusRejected = "rejected"
)

// CoinSellerSubApplication 是子币商邀请审核事实；pending 不代表父子关系已经生效。
type CoinSellerSubApplication struct {
	ApplicationID     int64
	CommandID         string
	ParentUserID      int64
	TargetUserID      int64
	Status            string
	RelationID        int64
	ReviewedByAdminID int64
	ReviewReason      string
	ReviewedAtMs      int64
	CreatedAtMs       int64
	UpdatedAtMs       int64
}

// CreateSubCoinSellerResult 是历史直开 RPC 的兼容返回；新流程只应返回待审核申请。
type CreateSubCoinSellerResult struct {
	Relation CoinSellerSubRelation
	Child    CoinSellerListItem
}

// SubmitSubCoinSellerApplicationResult 是 H5 提交子币商申请后的审核状态回执。
type SubmitSubCoinSellerApplicationResult struct {
	Application CoinSellerSubApplication
}

// ReviewSubCoinSellerApplicationResult 是后台审核后的申请和生效关系投影。
type ReviewSubCoinSellerApplicationResult struct {
	Application CoinSellerSubApplication
	Relation    CoinSellerSubRelation
	Child       CoinSellerListItem
}

// ListSubCoinSellersResult 是直属子币商分页列表。
type ListSubCoinSellersResult struct {
	Items    []CoinSellerListItem
	Total    int64
	Page     int
	PageSize int
}

// UserRoleSummary 是面向 App 入口显隐的聚合 read model。
// 这里不承载团队统计或薪资指标，只表达当前用户是否拥有可用身份和待处理邀请数量。
type UserRoleSummary struct {
	UserID                 int64
	IsHost                 bool
	IsAgency               bool
	IsManager              bool
	IsBD                   bool
	IsBDLeader             bool
	IsCoinSeller           bool
	HostStatus             string
	AgencyID               int64
	BDID                   int64
	BDStatus               string
	CoinSellerStatus       string
	PendingRoleInvitations int64
}

// AgencyMembership 是 host 与 Agency 的有时效归属事实。
type AgencyMembership struct {
	MembershipID   int64
	AgencyID       int64
	HostUserID     int64
	RegionID       int64
	MembershipType string
	Status         string
	JoinedAtMs     int64
	EndedAtMs      int64
	EndedByUserID  int64
	EndedReason    string
	CreatedAtMs    int64
	UpdatedAtMs    int64
}

// AgencyApplication 是用户申请加入 Agency 的状态机事实。
type AgencyApplication struct {
	ApplicationID    int64
	CommandID        string
	ApplicantUserID  int64
	AgencyID         int64
	RegionID         int64
	Status           string
	ReviewedByUserID int64
	ReviewReason     string
	ReviewedAtMs     int64
	CreatedAtMs      int64
	UpdatedAtMs      int64
}

// RoleInvitation 是 BD 或 BD Leader 发起的角色邀请事实。
type RoleInvitation struct {
	InvitationID    int64
	CommandID       string
	InvitationType  string
	Status          string
	InviterUserID   int64
	InviterBDUserID int64
	TargetUserID    int64
	// ExternalOperatorUserID 非 0 时表示邀请由外管专用入口创建；普通 App 邀请保持 0。
	ExternalOperatorUserID int64
	RegionID               int64
	AgencyName             string
	ParentBDUserID         int64
	ParentLeaderUserID     int64
	// ParentOwnerUserID 固化选中 BD 的外管 owner，接受时用于识别父级归属漂移。
	ParentOwnerUserID int64
	// ParentAgencyID 固化 Host 邀请选择的 Agency，不能在接受时按操作者身份重新推导。
	ParentAgencyID    int64
	ProcessedByUserID int64
	ProcessReason     string
	ProcessedAtMs     int64
	CreatedAtMs       int64
	UpdatedAtMs       int64
}

// ExternalTeamUser 是外管团队列表和邀请候选共同使用的用户投影。
// Roles 只表达 App 业务关系，不包含 portal Local/国家外管经理/外管SuperAdmin 身份。
type ExternalTeamUser struct {
	UserID               int64
	DefaultDisplayUserID string
	CurrentDisplayUserID string
	Username             string
	Avatar               string
	Status               string
	RegionID             int64
	Roles                []string
	ParentOwnerUserID    int64
	ParentBDUserID       int64
	AgencyID             int64
}

// ExternalTeamUsers 是外管团队用户的真实数据库分页结果。
type ExternalTeamUsers struct {
	Users    []ExternalTeamUser
	Total    int64
	Page     int
	PageSize int
}

// CommandResult 是 host_command_results 的轻量投影，用于命令幂等返回已有事实。
type CommandResult struct {
	CommandID   string
	CommandType string
	ResultType  string
	ResultID    int64
	CreatedAtMs int64
}

// ReviewAgencyApplicationResult 聚合申请审核后需要返回给调用方的事实。
type ReviewAgencyApplicationResult struct {
	Application AgencyApplication
	HostProfile HostProfile
	Membership  AgencyMembership
}

// KickAgencyHostResult 聚合踢出后需要返回给调用方的事实。
type KickAgencyHostResult struct {
	Membership  AgencyMembership
	HostProfile HostProfile
}

// ProcessRoleInvitationResult 聚合邀请处理后可能创建的角色事实。
type ProcessRoleInvitationResult struct {
	Invitation  RoleInvitation
	HostProfile HostProfile
	Agency      Agency
	Membership  AgencyMembership
	BDProfile   BDProfile
}

// CreateAgencyResult 聚合后台创建 Agency 后同步产生的 owner 身份和 owner membership。
type CreateAgencyResult struct {
	Agency      Agency
	HostProfile HostProfile
	Membership  AgencyMembership
}
