package server

import (
	"context"
	"fmt"

	apiv1 "github.com/tidbcloud/cluster-service-ng/api/cluster-service-ng/v1beta"
	"github.com/tidbcloud/cluster-service-ng/pkg/storage/mysql/schema"
)

type GetBackupGcSettingInput struct {
	*apiv1.GetBackupGcSettingRequest
}

type GetBackupGcSettingOutput struct {
	*apiv1.BackupGcSetting
}

func (s *serverImpl) GetBackupGcSetting(ctx context.Context, req *GetBackupGcSettingInput) (*GetBackupGcSettingOutput, error) {
	sharedPoolId := req.GetSharedPoolId()
	backupGcSetting, err := s.backupGcSettingRepo.Load(ctx, sharedPoolId)
	if err != nil {
		return nil, fmt.Errorf("failed to load backup gc setting, shared pool id: %s, err: %w", sharedPoolId, err)
	}

	return &GetBackupGcSettingOutput{
		BackupGcSetting: &apiv1.BackupGcSetting{
			SharedPoolId:            sharedPoolId,
			Status:                  convertBackupGcSettingStatus(backupGcSetting.Status),
			HasManualBackup:         *backupGcSetting.HasManualBackup,
			T2StrategyEnabled:       *backupGcSetting.T2StrategyEnabled,
			MinT2DataAgeDays:        backupGcSetting.MinT2DataAgeDays,
			T3StrategyEnabled:       *backupGcSetting.T3StrategyEnabled,
			MinT3DataAgeDays:        backupGcSetting.MinT3DataAgeDays,
			MaxT1MetaLifetimeDays:   *backupGcSetting.MaxT1MetaLifetimeDays,
			MaxT1WalLifetimeDays:    *backupGcSetting.MaxT1WalLifetimeDays,
			MaxT1PackedLifetimeDays: *backupGcSetting.MaxT1PackedLifetimeDays,
			MaxT2SstLifetimeDays:    *backupGcSetting.MaxT2SstLifetimeDays,
			MaxT3DataLifetimeDays:   *backupGcSetting.MaxT3DataLifetimeDays,
		},
	}, nil
}

func convertBackupGcSettingStatus(bsstatus string) apiv1.BackupGcSettingStatus {
	switch bsstatus {
	case schema.BackupGcStatusSPCreating:
		return apiv1.BackupGcSettingStatus_SP_CREATING
	case schema.BackupGcStatusSPRunning:
		return apiv1.BackupGcSettingStatus_SP_RUNNING
	case schema.BackupGcStatusSPDeleting:
		return apiv1.BackupGcSettingStatus_SP_DELETING
	case schema.BackupGcStatusSPDeleted:
		return apiv1.BackupGcSettingStatus_SP_DELETED
	case schema.BackupGcStatusAutoBackupExpired:
		return apiv1.BackupGcSettingStatus_AUTO_BACKUP_EXPIRED
	default:
		return apiv1.BackupGcSettingStatus_BACKUP_GC_SETTING_STATUS_UNSPECIFIED
	}
}
