package service

import (
	"context"
	"kra/internal/biz/system"
	"time"

	"kra/internal/service/dto"
)

type ParameterService struct{ uc *system.ParameterUsecase }

func NewParameterService(uc *system.ParameterUsecase) *ParameterService {
	return &ParameterService{uc: uc}
}

func parameterDomain(value *dto.SystemParameterRequest) *system.SystemParameter {
	return &system.SystemParameter{ID: value.ID, CreatedAt: value.CreatedAt, UpdatedAt: value.UpdatedAt, Name: value.Name, Key: value.Key, Value: value.Value, Desc: value.Description}
}
func (s *ParameterService) CreateParameterRequest(ctx context.Context, req *dto.SystemParameterRequest) error {
	return s.CreateParameter(ctx, parameterDomain(req))
}
func (s *ParameterService) UpdateParameterRequest(ctx context.Context, req *dto.SystemParameterRequest) error {
	return s.UpdateParameter(ctx, parameterDomain(req))
}
func (s *ParameterService) ParametersFilter(ctx context.Context, page, size int, name, key string, start, end *time.Time) ([]*dto.SystemParameterResponse, int64, error) {
	return s.Parameters(ctx, page, size, &system.SystemParameter{Name: name, Key: key, StartCreatedAt: start, EndCreatedAt: end})
}
func parameterDTO(v *system.SystemParameter) *dto.SystemParameterResponse {
	return &dto.SystemParameterResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Name: v.Name, Key: v.Key, Value: v.Value, Desc: v.Desc}
}
func (s *ParameterService) Parameters(ctx context.Context, page, size int, q *system.SystemParameter) ([]*dto.SystemParameterResponse, int64, error) {
	items, total, err := s.uc.ListParameters(ctx, page, size, q)
	if err != nil {
		return nil, 0, err
	}
	out := make([]*dto.SystemParameterResponse, 0, len(items))
	for _, v := range items {
		out = append(out, parameterDTO(v))
	}
	return out, total, nil
}
func (s *ParameterService) ParameterByID(ctx context.Context, id string) (*dto.SystemParameterResponse, error) {
	v, err := s.uc.FindParameterByID(ctx, id)
	if err != nil {
		return nil, err
	}
	return parameterDTO(v), nil
}
func (s *ParameterService) ParameterByKey(ctx context.Context, key string) (*dto.SystemParameterResponse, error) {
	v, err := s.uc.FindParameterByKey(ctx, key)
	if err != nil {
		return nil, err
	}
	return parameterDTO(v), nil
}
func (s *ParameterService) CreateParameter(ctx context.Context, v *system.SystemParameter) error {
	return s.uc.CreateParameter(ctx, v)
}
func (s *ParameterService) UpdateParameter(ctx context.Context, v *system.SystemParameter) error {
	return s.uc.UpdateParameter(ctx, v)
}
func (s *ParameterService) DeleteParameters(ctx context.Context, ids []string) error {
	return s.uc.DeleteParameters(ctx, ids)
}
