package migrate

import (
	"gorm.io/gorm"
)

var _ = AddDBMigrateRecord(
	"202508251508",
	func(db *gorm.DB) error {
		dmTasksTable := "CREATE TABLE IF NOT EXISTS `dm_tasks` (" +
			"  `id` varchar(255) NOT NULL," +
			"  `name` varchar(64) NOT NULL," +
			"  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP," +
			"  `updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP," +
			"  `deleted_time` timestamp NULL DEFAULT NULL," +
			"  `stage` enum('sourceCreating','sourceBounding','taskCreating','running','stopped','deleting','deleted') NOT NULL," +
			"  `creator` varchar(255) NULL," +
			"  `cluster_id` varchar(255) NOT NULL," +
			"  `project_id` varchar(255) NOT NULL," +
			"  `tenant_id` varchar(255) NOT NULL," +
			"  `cloud_provider` varchar(255) NOT NULL," +
			"  `region` varchar(255) NOT NULL," +
			"  `target_user` varchar(255) NULL," +
			"  `target_encrypted_password` varchar(255) NULL," +
			"  `mode` enum('full','incremental','all') NOT NULL," +
			"  PRIMARY KEY (`id`)," +
			"  INDEX `idx_dm_task_created_at` (`created_at`)," +
			"  INDEX `idx_dm_task_deleted_time` (`deleted_time`)," +
			"  INDEX `idx_dm_task_stage` (`stage`)," +
			"  INDEX `idx_dm_task_cluster` (`cluster_id`)," +
			"  INDEX `idx_dm_task_tenant` (`tenant_id`)" +
			")"
		err := db.Exec(dmTasksTable).Error
		if err != nil {
			return err
		}

		partialUniqueIndex := "CREATE UNIQUE INDEX `idx_dm_task_cluster_name_active` ON `dm_tasks` (`cluster_id`, `name`, (CASE WHEN deleted_time IS NULL THEN 1 ELSE NULL END))"
		err = db.Exec(partialUniqueIndex).Error
		if err != nil {
			return err
		}

		dmSourcesTable := "CREATE TABLE IF NOT EXISTS `dm_sources` (" +
			"  `id` varchar(255) NOT NULL," +
			"  `dm_task_id` varchar(255) NOT NULL," +
			"  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP," +
			"  `updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP," +
			"  `deleted_time` timestamp NULL DEFAULT NULL," +
			"  `stage` enum('creating','bounding','bounded','deleting','deleted') NOT NULL," +
			"  `creator` varchar(255) NULL," +
			"  `cluster_id` varchar(255) NOT NULL," +
			"  `project_id` varchar(255) NOT NULL," +
			"  `tenant_id` varchar(255) NOT NULL," +
			"  `binlog_name` varchar(256) NULL," +
			"  `binlog_pos` int NULL," +
			"  `binlog_gtid` varchar(255) NULL," +
			"  `conn_profile` json NULL," +
			"  `endpoint_id` varchar(255) NULL," +
			"  `block_allow_rules` json NULL," +
			"  PRIMARY KEY (`id`)," +
			"  INDEX `idx_dm_source_task` (`dm_task_id`)," +
			"  INDEX `idx_dm_source_endpoint` (`endpoint_id`)," +
			"  CONSTRAINT `fk_dm_sources_dm_task` FOREIGN KEY (`dm_task_id`) REFERENCES `dm_tasks` (`id`)" +
			")"
		err = db.Exec(dmSourcesTable).Error
		if err != nil {
			return err
		}

		dmPrechecksTable := "CREATE TABLE IF NOT EXISTS `dm_prechecks` (" +
			"  `id` varchar(255) NOT NULL," +
			"  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP," +
			"  `updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP," +
			"  `canceled_time` timestamp NULL DEFAULT NULL," +
			"  `creator` varchar(255) NULL," +
			"  `cluster_id` varchar(255) NOT NULL," +
			"  `project_id` varchar(255) NOT NULL," +
			"  `tenant_id` varchar(255) NOT NULL," +
			"  `request` json NULL," +
			"  `stage` enum('pending','running','finished','failed','canceled') NOT NULL," +
			"  `total_items` int NULL," +
			"  PRIMARY KEY (`id`)," +
			"  INDEX `idx_dm_precheck_stage` (`stage`)," +
			"  INDEX `idx_dm_precheck_canceled_time` (`canceled_time`)," +
			"  INDEX `idx_dm_precheck_cluster_id` (`cluster_id`)," +
			"  INDEX `idx_dm_precheck_tenant_id` (`tenant_id`)" +
			")"
		err = db.Exec(dmPrechecksTable).Error
		if err != nil {
			return err
		}

		dmPrecheckItemsTable := "CREATE TABLE IF NOT EXISTS `dm_precheck_items` (" +
			"  `id` varchar(255) NOT NULL," +
			"  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP," +
			"  `updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP," +
			"  `canceled_time` timestamp NULL DEFAULT NULL," +
			"  `stage` enum('pending','running','finished','failed','canceled') NOT NULL," +
			"  `dm_precheck_id` varchar(255) NOT NULL," +
			"  `description` varchar(1024) NOT NULL," +
			"  `type` int NOT NULL," +
			"  `results` json NULL," +
			"  PRIMARY KEY (`id`)," +
			"  INDEX `idx_dm_precheck_item_precheck` (`dm_precheck_id`)," +
			"  CONSTRAINT `fk_dm_precheck_items_precheck` FOREIGN KEY (`dm_precheck_id`) REFERENCES `dm_prechecks` (`id`)" +
			")"
		err = db.Exec(dmPrecheckItemsTable).Error
		if err != nil {
			return err
		}

		vpcEndpointsTable := "CREATE TABLE IF NOT EXISTS `dm_vpc_endpoints` (" +
			"  `id` varchar(255) NOT NULL," +
			"  `cluster_id` varchar(255) NOT NULL," +
			"  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP," +
			"  `updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP," +
			"  `deleted_time` timestamp NULL DEFAULT NULL," +
			"  `creator` varchar(255) NULL," +
			"  `service_name` varchar(255) NOT NULL," +
			"  `endpoint_id` varchar(255) NULL," +
			"  `state` enum('pending','pendingAcceptance','available','failed','deleted') NULL," +
			"  `vpc_id` varchar(255) NULL," +
			"  `creation_time_str` varchar(128) NULL," +
			"  `domain` varchar(255) NULL," +
			"  PRIMARY KEY (`id`)," +
			"  INDEX `idx_vpc_endpoint_cluster_id` (`cluster_id`)," +
			"  INDEX `idx_vpc_endpoint_service_name` (`service_name`)," +
			"  INDEX `idx_vpc_endpoint_state` (`state`)," +
			"  INDEX `idx_vpc_endpoint_deleted_time` (`deleted_time`)" +
			")"
		err = db.Exec(vpcEndpointsTable).Error
		if err != nil {
			return err
		}

		return nil
	},
)
