package tables

import (
	"github.com/pingcap/log"
	"gorm.io/gorm"
)

const (
	createDataAPPs = `
	CREATE TABLE IF NOT EXISTS dataapps (
  		id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  		project_id bigint(20) unsigned NOT NULL,
  		external_app_id varchar(255) NOT NULL DEFAULT '',
  		app_name varchar(255) DEFAULT '',
  		app_type enum('dataapi','triggers','common') NOT NULL,
  		deployment_region varchar(255) DEFAULT NULL,
  		created_by varchar(255) NOT NULL DEFAULT '',
  		updated_by varchar(255) DEFAULT NULL,
  		is_deleted tinyint(4) DEFAULT '0',
  		created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  		updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  		PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */,
  		UNIQUE KEY idx_dataapps_app_name (external_app_id),
  		KEY idx_dataapps_project_id (project_id)
	) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=1;
	`
	createDataAPIKeys = `
	CREATE TABLE IF NOT EXISTS dataapi_keys (
  		id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  		dataapp_id bigint(20) unsigned NOT NULL,
 		 api_key varchar(255) NOT NULL,
  		description varchar(255) DEFAULT NULL,
  		created_by varchar(255) NOT NULL DEFAULT '',
  		updated_by varchar(255) DEFAULT NULL,
  		is_deleted tinyint(4) DEFAULT '0',
  		created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  		updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  		PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */,
  		UNIQUE KEY idx_dataapi_keys_api_key (api_key),
  		KEY idx_dataapi_keys_dataapp_id (dataapp_id)
	) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=1;
	`

	createEndpoints = `
	CREATE TABLE IF NOT EXISTS endpoints (
  		id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  		dataapp_id bigint(20) unsigned NOT NULL,
		name varchar(255) NOT NULL DEFAULT '',
  		description varchar(255) DEFAULT NULL,
  		endpoint varchar(512) DEFAULT NULL,
  		method varchar(64) DEFAULT NULL,
		cluster_id bigint(20) DEFAULT NULL,
  		database varchar(255) DEFAULT NULL,
  		sql_template text DEFAULT NULL,
  		args text DEFAULT NULL,
		settings text DEFAULT NULL,
  		created_by varchar(255) NOT NULL DEFAULT '',
  		updated_by varchar(255) DEFAULT NULL,
  		created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  		updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  		PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */,
  		UNIQUE KEY idx_unique_endpoint (dataapp_id,endpoint,method)
	) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=1;
	`

	createEndpointPublish = `
	CREATE TABLE IF NOT EXISTS endpoint_release_versions (
  		id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  		dataapp_id bigint(20) unsigned NOT NULL,
  		endpoint_id bigint(20) unsigned NOT NULL,
		version varchar(255) DEFAULT NULL,
  		endpoint varchar(512) DEFAULT NULL,
  		method varchar(64) DEFAULT NULL,
		cluster_id bigint(20) DEFAULT NULL,
  		database varchar(255) DEFAULT NULL,
		sql_template text DEFAULT NULL,
		args text DEFAULT NULL,
		settings text DEFAULT NULL,
  		created_by varchar(255) NOT NULL DEFAULT '',
  		updated_by varchar(255) DEFAULT NULL,
  		created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  		updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  		PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */,
		UNIQUE KEY idx_unique_endpoint (endpoint_id)
	) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=1;
	`

	createEndpointPublishVersions = `
	CREATE TABLE IF NOT EXISTS endpoint_publish_versions (
  		id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  		dataapp_id bigint(20) unsigned NOT NULL,
  		endpoint_id bigint(20) unsigned NOT NULL,
		name varchar(255) NOT NULL DEFAULT '',
  		description varchar(255) DEFAULT NULL,
  		endpoint varchar(512) DEFAULT NULL,
  		method varchar(64) DEFAULT NULL,
		cluster_id bigint(20) DEFAULT NULL,
  		database varchar(255) DEFAULT NULL,
  		sql_template text DEFAULT NULL,
		args text DEFAULT NULL,
		settings text DEFAULT NULL,
		version varchar(255) DEFAULT NULL,
		is_online tinyint(4) DEFAULT NULL,
  		created_by varchar(255) NOT NULL DEFAULT '',
  		created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  		updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  		PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */
	) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=1;
	`
)

func CreateCentralTables(db *gorm.DB) error {
	err := db.Exec(createDataAPIKeys).Error
	if err != nil {
		log.Error("create dataapi_keys failed")
		return err
	}
	err = db.Exec(createDataAPPs).Error
	if err != nil {
		log.Error("create dataapps failed")
		return err
	}
	err = db.Exec(createEndpoints).Error
	if err != nil {
		log.Error("create endpoints failed")
		return err
	}

	err = db.Exec(createEndpointPublish).Error
	if err != nil {
		log.Error("create endpoint_publish failed")
		return err
	}

	err = db.Exec(createEndpointPublishVersions).Error
	if err != nil {
		log.Error("create endpoint_publish_versions failed")
		return err
	}
	return nil
}
