package migration

import (
	"context"
	"fmt"

	dbpkg "github.com/tidbcloud/pkgv2/db"
	"gorm.io/gorm"

	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/infra/repoimpl/br"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/infra/repoimpl/schema"
)

var _ = AddDBMigrateRecord(
	"202512120001",
	func(db *gorm.DB) error {
		return db.Transaction(func(tx *gorm.DB) error {
			if err := tx.AutoMigrate(&schema.BackupSetting{}, &schema.BackupPolicy{}); err != nil {
				return err
			}

			// add backup policy records
			provider := dbpkg.NewProvider(tx)

			ctx := context.Background()
			backupPolicyRepo := br.NewBackupPolicyRepo(provider)
			backupPolicies := []*entity.BackupPolicy{
				{
					BackupPolicy: &schema.BackupPolicy{
						Name:        schema.BackupPolicyNameTIER1,
						Description: "Default Tier",
						Pitr: &schema.BackupPolicyPiTR{
							RetentionDays: 7,
						},
						HourlyBackup: &schema.BackupPolicyHourlyBackup{
							RetentionDays: 7,
						},
						DailyBackup: &schema.BackupPolicyDailyBackup{
							RetentionDays: 33,
							StartTimeUtc:  "00:00",
						},
					},
				},
				{
					BackupPolicy: &schema.BackupPolicy{
						Name:        schema.BackupPolicyNameTIER2,
						Description: "Extended Tier",
						Pitr: &schema.BackupPolicyPiTR{
							RetentionDays: 15,
						},
						HourlyBackup: &schema.BackupPolicyHourlyBackup{
							RetentionDays: 15,
						},
						DailyBackup: &schema.BackupPolicyDailyBackup{
							RetentionDays: 60,
							StartTimeUtc:  "00:00",
						},
					},
				},
				{
					BackupPolicy: &schema.BackupPolicy{
						Name:        schema.BackupPolicyNameTIER3,
						Description: "Extended Tier",
						Pitr: &schema.BackupPolicyPiTR{
							RetentionDays: 32,
						},
						HourlyBackup: &schema.BackupPolicyHourlyBackup{
							RetentionDays: 32,
						},
						DailyBackup: &schema.BackupPolicyDailyBackup{
							RetentionDays: 90,
							StartTimeUtc:  "00:00",
						},
					},
				},
			}

			for _, backupPolicy := range backupPolicies {
				if err := backupPolicyRepo.Save(ctx, backupPolicy); err != nil {
					return fmt.Errorf("failed to save backup policy, tier: %s, error: %w", backupPolicy.Name, err)
				}
			}

			return nil
		})
	},
)
