package br

import (
	"context"

	"github.com/samber/lo"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func (s *serviceImpl) ListBackupPolicies(
	ctx context.Context,
	req *globalngv1.ListBackupPoliciesRequest,
) (*globalngv1.ListBackupPoliciesResponse, bizerr.BizError) {
	ctx, span := tracer.Start(ctx, "Domain.ListBackupPolicies")
	defer span.End()

	backupPolicies, err := s.backupPolicyRepo.ListAll(ctx)
	if err != nil {
		return nil, bizerr.WrapError(err, "ListBackupPolicies")
	}

	return &globalngv1.ListBackupPoliciesResponse{
		BackupPolicies: convertToNextgenBackupPolicies(backupPolicies),
	}, nil
}

func convertToNextgenBackupPolicies(backupPolicies []*entity.BackupPolicy) []*globalngv1.BackupSetting_BackupPolicy {
	return lo.Map(backupPolicies, func(it *entity.BackupPolicy, _ int) *globalngv1.BackupSetting_BackupPolicy {
		return &globalngv1.BackupSetting_BackupPolicy{
			Name:        globalngv1.BackupSetting_BackupPolicy_Tier(globalngv1.BackupSetting_BackupPolicy_Tier_value[string(it.Name)]),
			Description: it.Description,
			Pitr: &globalngv1.BackupSetting_BackupPolicy_PiTRPolicy{
				RetentionDays: int32(it.Pitr.RetentionDays),
			},
			HourlyBackup: &globalngv1.BackupSetting_BackupPolicy_HourlyPolicy{
				RetentionDays: int32(it.HourlyBackup.RetentionDays),
			},
			DailyBackup: &globalngv1.BackupSetting_BackupPolicy_DailyPolicy{
				RetentionDays: int32(it.DailyBackup.RetentionDays),
				StartTimeUtc:  it.DailyBackup.StartTimeUtc,
			},
		}
	})
}
