package cross

import (
	"context"

	"gorm.io/gorm"

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

func (d *CrossDao) ListActiveProjects(ctx context.Context, tx *gorm.DB, userID uint64, orgID uint64, listAllProjects bool) ([]entity.Project, error) {
	if listAllProjects {
		return d.Project.ListActiveProjectsByOrgID(ctx, tx, orgID)
	}

	// Otherwise return active projects that user can access
	return d.ListActiveProjectsByUserIDAndOrgID(ctx, tx, userID, orgID)
}

func (d *CrossDao) ListActiveProjectsByUserIDAndOrgID(ctx context.Context, tx *gorm.DB, userID uint64, orgID uint64) ([]entity.Project, error) {
	projects, err := d.Project.ListActiveProjectsByOrgID(ctx, tx, orgID)
	if err != nil {
		return nil, err
	}

	orgProjectIDList := make([]uint64, len(projects))
	for i, project := range projects {
		orgProjectIDList[i] = project.ID.Uint64()
	}
	if len(orgProjectIDList) == 0 {
		return nil, nil
	}

	roles, err := d.Role.ListRolesByTargetOnScopeList(ctx, tx,
		entity.RoleBindingTargetUser, userID, entity.RoleBindingScopeProject, orgProjectIDList, []string{entity.RoleBindingStatusActive})
	if err != nil {
		return nil, err
	}

	// Filter projects by user, preserving the order
	var result []entity.Project
	for _, project := range projects {
		for _, role := range roles {
			if project.ID == role.ScopeID {
				result = append(result, project)
			}
		}
	}
	if len(result) == 0 {
		return nil, nil
	}

	return result, nil
}
