package applogic

import (
	"fmt"
	"strings"

	"aijianzhan/platform/internal/authx"
	"aijianzhan/platform/internal/userstore"
)

type MemberLogic struct {
	*AuthLogic
}

func NewMemberLogic(l *AuthLogic) *MemberLogic {
	return &MemberLogic{AuthLogic: l}
}

func (l *MemberLogic) List() ([]userstore.User, error) {
	tid := authx.TenantID(l.ctx)
	if tid <= 0 {
		return nil, fmt.Errorf("missing tenant")
	}
	return l.svcCtx.Users.ListMembers(l.ctx, tid)
}

// Create 创建成员：用户名始终随机唯一；password 为空则随机初始密码（用户登录后可自行修改）。
func (l *MemberLogic) Create(password, displayName, role string, orgUnitID int64) (*userstore.User, string, error) {
	tid := authx.TenantID(l.ctx)
	if tid <= 0 {
		return nil, "", fmt.Errorf("missing tenant")
	}
	if role == "" {
		role = authx.Role编辑
	}
	uname, err := userstore.AllocUniqueUsername(l.ctx, l.svcCtx.Users.UsernameExists)
	if err != nil {
		return nil, "", err
	}
	u, plain, err := l.svcCtx.Users.CreateMember(l.ctx, tid, uname, password, displayName, role, orgUnitID)
	if err != nil {
		// 极罕见冲突：再试一次
		if strings.Contains(err.Error(), "already exists") {
			uname2, e2 := userstore.AllocUniqueUsername(l.ctx, l.svcCtx.Users.UsernameExists)
			if e2 != nil {
				return nil, "", e2
			}
			return l.svcCtx.Users.CreateMember(l.ctx, tid, uname2, password, displayName, role, orgUnitID)
		}
		return nil, "", err
	}
	return u, plain, nil
}

func (l *MemberLogic) Update(userID int64, role string, orgUnitID int64, status string) (*userstore.User, error) {
	tid := authx.TenantID(l.ctx)
	if tid <= 0 {
		return nil, fmt.Errorf("missing tenant")
	}
	if userID == authx.UserID(l.ctx) && role != "" && authx.NormalizeRole(role) != authx.Role管理员 {
		if authx.IsCompanyAdmin(authx.Role(l.ctx)) {
			return nil, fmt.Errorf("不能修改自己的角色，请由其他管理员操作")
		}
	}
	return l.svcCtx.Users.UpdateMember(l.ctx, tid, userID, role, orgUnitID, status)
}

// SetPhone 管理员为本公司成员绑定/更换/清空手机号（空字符串解绑）。
func (l *MemberLogic) SetPhone(userID int64, phone string) (*userstore.User, error) {
	tid := authx.TenantID(l.ctx)
	if tid <= 0 {
		return nil, fmt.Errorf("missing tenant")
	}
	u, err := l.svcCtx.Users.GetByID(l.ctx, userID)
	if err != nil {
		return nil, err
	}
	if u.TenantID != tid {
		return nil, fmt.Errorf("成员不属于本公司")
	}
	return l.svcCtx.Users.BindPhone(l.ctx, userID, phone)
}
