package cross

import (
	"context"

	"go.uber.org/zap"

	"github.com/tidbcloud/tiinf/monitor/tilog"

	"github.com/tidbcloud/account/internel/dao/entity"
	"github.com/tidbcloud/account/internel/dao/org"
	"gorm.io/gorm"
)

func (d *CrossDao) ListOrgsByUserID(ctx context.Context, tx *gorm.DB, userID uint64, status []string) ([]entity.Tenant, error) {
	tilog.Info(ctx, "ListOrgsByUserID req", zap.Any("userID=", userID), zap.Any("status=", status))
	roles, err := d.Role.ListRolesByTargetOnScopeList(ctx, tx, entity.RoleBindingTargetUser, userID, entity.RoleBindingScopeOrg, []uint64{}, []string{entity.RoleBindingStatusActive})

	if err != nil {
		return nil, err
	}

	orgIDMap := map[uint64]int{}
	for _, role := range roles {
		if role.ScopeType == entity.RoleBindingScopeOrg {
			orgIDMap[role.ScopeID.Uint64()] += 1
		}
	}

	orgIDs := make([]uint64, 0, len(orgIDMap))
	for orgID := range orgIDMap {
		orgIDs = append(orgIDs, orgID)
	}
	if len(orgIDs) == 0 {
		return []entity.Tenant{}, nil
	}
	resp, err := d.Org.ListOrgs(ctx, tx, org.ListOrgsParam{
		Filter: org.ListOrgsFilter{
			ID:     orgIDs,
			Status: status,
		},
	})
	if err != nil {
		return nil, err
	}
	tilog.Info(ctx, "ListOrgsByUserID resp", zap.Any("size=", len(resp.List)))

	return resp.List, nil
}

func (d *CrossDao) LegacyGetOrgByUser(ctx context.Context, tx *gorm.DB, userID uint64, status []string) (*entity.Tenant, bool, error) {
	orgs, err := d.ListOrgsByUserID(ctx, tx, userID, status)
	if err != nil {
		return nil, false, err
	}
	if len(orgs) == 0 {
		return nil, false, nil
	}
	return &orgs[0], true, nil
}
