terraform {
  required_providers {
    alicloud = {
      source  = "aliyun/alicloud"
      version = "1.266.0"
    }
  }

  backend "oss" {
    profile = "default"
  }
}

provider "alicloud" {
  profile = "default"
  region  = var.region
}

data "alicloud_db_zones" "this" {
  engine                   = "MySQL"
  engine_version           = "8.0"
  instance_charge_type     = "PostPaid"
  category                 = "Basic"
  db_instance_storage_type = "cloud_essd"
}

data "alicloud_db_instance_classes" "this" {
  zone_id                  = data.alicloud_db_zones.this.zones.0.id
  engine                   = "MySQL"
  engine_version           = "8.0"
  category                 = "Basic"
  db_instance_storage_type = "cloud_essd"
  instance_charge_type     = "PostPaid"
}

resource "alicloud_vpc" "this" {
  vpc_name   = "${var.name}-rds-vpc"
  cidr_block = "172.16.0.0/16"
}

resource "alicloud_vswitch" "this" {
  vpc_id       = alicloud_vpc.this.id
  cidr_block   = "172.16.0.0/24"
  zone_id      = data.alicloud_db_zones.this.zones.0.id
  vswitch_name = "${var.name}-rds-vswitch"
}

resource "alicloud_security_group" "this" {
  security_group_name = "${var.name}-rds-sg"
  vpc_id              = alicloud_vpc.this.id
}

resource "alicloud_kms_instance" "this" {
  instance_name = "${var.name}-kms"
  payment_type                = "PayAsYouGo"
  product_version             = 3
  vpc_id                      = alicloud_vpc.this.id
  zone_ids                    = [alicloud_vswitch.this.zone_id]
  vswitch_ids                 = [alicloud_vswitch.this.id]
}

resource "alicloud_kms_key" "this" {
  dkms_instance_id = alicloud_kms_instance.this.id
  description            = "${alicloud_kms_instance.this.instance_name}-default-key"
  status                 = "Enabled"
  pending_window_in_days = "7"
}

resource "alicloud_db_instance" "this" {
  engine                   = "MySQL"
  engine_version           = "8.0"
  instance_type            = data.alicloud_db_instance_classes.this.instance_classes.0.instance_class
  instance_storage         = data.alicloud_db_instance_classes.this.instance_classes.0.storage_range.min
  instance_charge_type     = "Postpaid"
  instance_name            = var.name
  vswitch_id               = alicloud_vswitch.this.id
  monitoring_period        = "60"
  db_instance_storage_type = "cloud_essd"
  security_group_ids       = [alicloud_security_group.this.id]

  tags = {
    environment = var.env
    usedby = "dbaas-control-plane-seed"
    servicetype = "nextgen"
    tenant = "admin"
  }
}

resource "alicloud_db_connection" "this" {
  instance_id       = alicloud_db_instance.this.id
  connection_prefix = var.name
}

output "connection_string" {
  value = alicloud_db_connection.this.connection_string
}

output "kms_instance_id" {
  value = alicloud_kms_instance.this.id
}