package migrate

import (
	"github.com/pingcap/log"
	"go.uber.org/zap"
	"gorm.io/gorm"
)

const createBackupScheduleHistoriesSQL = "CREATE TABLE IF NOT EXISTS `backup_schedule_histories` (" +
	"`id` bigint(20) NOT NULL AUTO_INCREMENT," +
	"`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP," +
	"`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP," +
	"`schedule_id` bigint(20) NOT NULL," +
	"`tenant_id` varchar(255) NOT NULL," +
	"`cluster_id` varchar(255) NOT NULL," +
	"`region` varchar(255) NOT NULL," +
	"`schedule_cron` varchar(255) NOT NULL," +
	"`retention` int(11) NOT NULL," +
	"`kubernetes` varchar(255) NULL DEFAULT ''," +
	"`cloud_provider` varchar(255) NULL DEFAULT ''," +
	"`source_token` varchar(255) NULL DEFAULT NULL," +
	"`enhanced_encryption_enabled` tinyint(1) NULL DEFAULT NULL," +
	"`zone_redundant_enabled` tinyint(1) NULL DEFAULT NULL," +
	"`valid_from` timestamp NOT NULL," +
	"`valid_to` timestamp NULL DEFAULT NULL," +
	"`deleted_at` timestamp NULL DEFAULT NULL," +
	"PRIMARY KEY (`id`)," +
	"INDEX `idx_bsh_schedule_id` (`schedule_id`)," +
	"UNIQUE KEY `uk_bsh_schedule_valid_to` (`schedule_id`, `valid_to`)," +
	"INDEX `idx_bsh_cluster_valid_from` (`cluster_id`, `valid_from`)," +
	"INDEX `idx_bsh_cluster_valid_to` (`cluster_id`, `valid_to`)," +
	"INDEX `idx_bsh_tenant_valid_to` (`tenant_id`, `valid_to`)," +
	"INDEX `idx_bsh_valid_to` (`valid_to`)" +
	")"

const createBackupTombstonesSQL = "CREATE TABLE IF NOT EXISTS `backup_tombstones` (" +
	"`id` bigint(20) NOT NULL AUTO_INCREMENT," +
	"`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP," +
	"`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP," +
	"`tenant_id` varchar(255) NOT NULL," +
	"`cluster_id` varchar(255) NOT NULL," +
	"`backup_id` varchar(255) NOT NULL," +
	"`schedule_time` timestamp NOT NULL," +
	"`deleted_at` timestamp NOT NULL," +
	"`expire_time` timestamp NULL DEFAULT NULL," +
	"PRIMARY KEY (`id`)," +
	"UNIQUE KEY `uk_cluster_schedule` (`cluster_id`, `schedule_time`)," +
	"INDEX `idx_bt_tenant_id` (`tenant_id`)," +
	"INDEX `idx_bt_schedule_time` (`schedule_time`)," +
	"INDEX `idx_bt_deleted_at` (`deleted_at`)," +
	"INDEX `idx_bt_expire_time` (`expire_time`)" +
	")"

const createBackupVirtualizationMetadataSQL = "CREATE TABLE IF NOT EXISTS `backup_virtualization_metadata` (" +
	"`id` tinyint unsigned NOT NULL," +
	"`cutover_at` timestamp NOT NULL," +
	"PRIMARY KEY (`id`)" +
	")"

const initializeBackupVirtualizationCutoverSQL = "INSERT INTO `backup_virtualization_metadata` (`id`, `cutover_at`) " +
	"VALUES (1, CURRENT_TIMESTAMP) ON DUPLICATE KEY UPDATE `id` = `id`"

const createPhysicalBackupSlotsSQL = "CREATE TABLE IF NOT EXISTS `physical_backup_slots` (" +
	"`id` bigint(20) NOT NULL AUTO_INCREMENT," +
	"`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP," +
	"`cloud_provider` varchar(255) NOT NULL," +
	"`region` varchar(255) NOT NULL," +
	"`kubernetes` varchar(255) NOT NULL," +
	"`slot_time` timestamp NOT NULL," +
	"`backup_id` bigint unsigned NOT NULL," +
	"`backup_name` varchar(255) NOT NULL," +
	"`backup_time` timestamp NOT NULL," +
	"PRIMARY KEY (`id`)," +
	"UNIQUE KEY `uk_physical_backup_slot` (`cloud_provider`,`region`,`kubernetes`,`slot_time`)," +
	"INDEX `idx_pbs_backup_time` (`backup_time`)," +
	"INDEX `idx_pbs_scope_backup_time` (`cloud_provider`,`region`,`kubernetes`,`backup_time`)" +
	")"

var backupVirtualizationMigrationSQLs = []string{
	createBackupScheduleHistoriesSQL,
	createBackupTombstonesSQL,
	createBackupVirtualizationMetadataSQL,
	createPhysicalBackupSlotsSQL,
	initializeBackupVirtualizationCutoverSQL,
}

var _ = AddDBMigrateRecord(
	"202607081200",
	func(db *gorm.DB) error {
		for _, sql := range backupVirtualizationMigrationSQLs {
			if err := db.Exec(sql).Error; err != nil {
				log.Error("execute backup virtualization migration sql failed", zap.String("sql", sql), zap.Error(err))
				return err
			}
		}
		return nil
	},
)
