package cross

import (
	"context"

	"gorm.io/gorm"

	"github.com/tidbcloud/account/internel/dao/entity"
	"github.com/tidbcloud/account/internel/dao/org"
	"github.com/tidbcloud/account/internel/dao/project"
	"github.com/tidbcloud/account/internel/dao/role"
	"github.com/tidbcloud/account/internel/dao/security"
	"github.com/tidbcloud/account/internel/dao/user"
)

type CrossDaoIface interface {
	Dao() *CrossDao

	// users
	CreateSystemUserByOrgID(ctx context.Context, tx *gorm.DB, orgID uint64) (*entity.User, error)
	GetOrCreateSystemUserByOrgID(ctx context.Context, tx *gorm.DB, orgID uint64) (*entity.User, error)
	ListUsersByProjectID(ctx context.Context, tx *gorm.DB, projectID uint64, roleStatus []string) ([]entity.User, error)
	ListUsersByOrgIDAndRole(ctx context.Context, tx *gorm.DB, orgID uint64, role string, roleStatus []string) ([]entity.User, error)

	// orgs
	IsUserInOrg(ctx context.Context, tx *gorm.DB, userID uint64, orgID uint64) (bool, error)
	ListOrgsByUserID(ctx context.Context, tx *gorm.DB, userID uint64, status []string) ([]entity.Tenant, error)
	LegacyGetOrgByUser(ctx context.Context, tx *gorm.DB, userID uint64, status []string) (*entity.Tenant, bool, error)

	// projects
	ListActiveProjects(ctx context.Context, tx *gorm.DB, userID uint64, orgID uint64, listAllProjects bool) ([]entity.Project, error)
	ListActiveProjectsByUserIDAndOrgID(ctx context.Context, tx *gorm.DB, userID uint64, orgID uint64) ([]entity.Project, error)
}

type CrossDao struct {
	User     user.UserDaoIface
	Org      org.OrgDaoIface
	Project  project.ProjectDaoIface
	Role     role.RoleDaoIface
	Security security.SecurityDaoIface
}

func NewDao() CrossDaoIface {
	e := &CrossDao{
		User:     user.NewDao(),
		Org:      org.NewDao(),
		Project:  project.NewDao(),
		Role:     role.NewDao(),
		Security: security.NewDao(),
	}

	return e
}

func (d *CrossDao) Dao() *CrossDao {
	return d
}
