package open

import (
	"context"
	"github.com/zeromicro/go-zero/core/stores/redis"
	"gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/db/repository"
	"gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
	"gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/cache"
	"gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction"
)

type SystemOpen interface {
	User(ctx context.Context, conn transaction.Conn, id int64) (User, error)
	UserByName(ctx context.Context, conn transaction.Conn, companyId int64, name string) ([]User, error)
	Company(ctx context.Context, conn transaction.Conn, id int64) (Company, error)
}

type systemOpenService struct {
	UserRepository    domain.SysUserRepository
	CompanyRepository domain.SysCompanyRepository
}

type (
	User    domain.SysUser
	Company domain.SysCompany
)

func (s systemOpenService) User(ctx context.Context, conn transaction.Conn, id int64) (User, error) {
	user, err := s.UserRepository.FindOne(ctx, conn, id)
	if err != nil {
		return User{}, err
	}
	return User(*user), err
}

func (s systemOpenService) UserByName(ctx context.Context, conn transaction.Conn, companyId int64, name string) ([]User, error) {
	_, users, err := s.UserRepository.Find(ctx, conn, domain.NewQueryOptions().MustWithKV("companyId", companyId).WithKV("name", name))
	result := make([]User, 0)
	if err != nil {
		return result, err
	}

	for _, item := range users {
		result = append(result, User(*item))
	}
	return result, err
}

func (s systemOpenService) Company(ctx context.Context, conn transaction.Conn, id int64) (Company, error) {
	company, err := s.CompanyRepository.FindOne(ctx, conn, id)
	if err != nil {
		return Company{}, err
	}
	return Company(*company), nil
}

func NewSystemOpen(Redis redis.RedisConf) SystemOpen {
	mlCache := cache.NewMultiLevelCache([]string{Redis.Host}, Redis.Pass)
	return systemOpenService{
		UserRepository:    repository.NewSysUserRepository(cache.NewCachedRepository(mlCache)),
		CompanyRepository: repository.NewSysCompanyRepository(cache.NewCachedRepository(mlCache)),
	}
}