package migrate

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

var _ = AddDBMigrateRecord(
	"202406141500",
	func(db *gorm.DB) error {
		backups := "CREATE TABLE IF NOT EXISTS `user_backups` (" +
			"  `id` varchar(255) NOT NULL," +
			"  `state` enum('succeeded','running','failed') NOT NULL," +
			"  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP," +
			"  `updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP," +
			"  `tenant_id` varchar(255) NOT NULL," +
			"  `project_id` varchar(255) NOT NULL," +
			"  `cluster_id` varchar(255) NOT NULL," +
			"  `region` varchar(255) NOT NULL," +
			"  `type` enum('auto','manual') NULL DEFAULT NULL," +
			"  `backup_time` timestamp NULL DEFAULT NULL," +
			"  `expire_time` timestamp NULL DEFAULT NULL," +
			"  `schedule_time` timestamp NULL DEFAULT NULL," +
			"  `backup_id` bigint(20) NULL DEFAULT NULL," +
			"  `backup_name` varchar(255) NULL DEFAULT NULL," +
			"  PRIMARY KEY (`id`)," +
			"  INDEX `idx_cluster_id` (`cluster_id`)," +
			"  INDEX `idx_expire_time` (`expire_time`)," +
			"  INDEX `idx_backup_time` (`backup_time`)" +
			")"
		err := db.Exec(backups).Error
		if err != nil {
			log.Error("create table user_backups failed", zap.Error(err))
		}
		schedules := "CREATE TABLE IF NOT EXISTS `backup_schedules` (" +
			"  `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," +
			"  `project_id` varchar(255) NOT NULL," +
			"  `cluster_id` varchar(255) NOT NULL," +
			"  `region` varchar(255) NOT NULL," +
			"  `schedule_cron` varchar(255) NOT NULL," +
			"  `schedule_time` timestamp NOT NULL," +
			"  `retention` int(11) NOT NULL," +
			"  PRIMARY KEY (`id`)," +
			"  INDEX `idx_cluster_id`(`cluster_id`)," +
			"  INDEX `idx_schedule_time`(`schedule_time`)" +
			")"
		err = db.Exec(schedules).Error
		if err != nil {
			log.Error("create table backup_schedules failed", zap.Error(err))
		}
		jobs := "CREATE TABLE IF NOT EXISTS `backup_jobs` (" +
			"  `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," +
			"  `start_time` timestamp NOT NULL," +
			"  `end_time` timestamp NULL," +
			"  `state` enum('pending','succeeded','failed') NOT NULL DEFAULT 'pending'," +
			"  `execute_times` int NOT NULL DEFAULT 1," +
			"  `succeeded_number` int NOT NULL DEFAULT 0," +
			"  `failed_number` int NOT NULL DEFAULT 0," +
			"  `log_id` varchar(255) NULL," +
			"  PRIMARY KEY (`id`)," +
			"  INDEX `idx_start_time`(`start_time`)" +
			")"
		err = db.Exec(jobs).Error
		if err != nil {
			log.Error("create table backup_jobs failed", zap.Error(err))
		}
		return nil
	},
)
