import * as awsx from "@pulumi/awsx";
import * as aws from "@pulumi/aws";
import { vpcNetworkCidr } from "./config";
import { Vpc } from "@pulumi/awsx/ec2";

const DATABASE_CLUSTER_TAG = "database-cluster";

export const createVpc = () => {
  const vpc = new awsx.ec2.Vpc("suno-main-vpc", {
    enableDnsHostnames: true,
    cidrBlock: vpcNetworkCidr,
    numberOfAvailabilityZones: 3,
    subnetStrategy: awsx.ec2.SubnetAllocationStrategy.Auto,
    subnetSpecs: [
      {
        name: "public",
        type: "Public",
        cidrMask: 24,
        tags: {
          "kubernetes.io/role/elb": "1",
        },
      },
      {
        name: "eks",
        type: "Private",
        cidrMask: 24,
        tags: {
          "eks-cluster": "true",
          "kubernetes.io/role/internal-elb": "1",
        },
      },
      {
        name: "database",
        type: "Private",
        cidrMask: 24,
        tags: {
          [DATABASE_CLUSTER_TAG]: "true",
        },
      },
    ],
  });

  return vpc;
};

export const createPrivateDatabaseSubnetGroup = (vpc: Vpc) => {
  const databaseSubnets = aws.ec2.getSubnets({
    tags: {
      [DATABASE_CLUSTER_TAG]: "true",
    },
  });

  const databaseSubnetIds = databaseSubnets.then((subnets) => subnets.ids);

  const subnetGroup = new aws.rds.SubnetGroup(
    "aurora-private-db-subnet-group",
    {
      subnetIds: databaseSubnetIds,
      tags: { Name: "aurora-private-db-subnet-group" },
    },
    { dependsOn: [vpc] }
  );
  return subnetGroup;
};

export const getSubnetsByUse = (name: string) => {
  const subnets = aws.ec2.getSubnets({
    filters: [
      {
        name: "tag:Name",
        values: [`*${name}*`],
      },
    ],
  });

  return subnets.then((subnet) => subnet.ids);
};

export const createPeeringConnection = (
  name: string,
  vpcId: string,
  peerVpcId: string,
  peerOwnerId: string
) => {
  const peeringConnection = new aws.ec2.VpcPeeringConnection(
    `peering-connector-${peerVpcId}`,
    {
      vpcId: vpcId,
      peerOwnerId: peerOwnerId,
      peerVpcId: peerVpcId,
      autoAccept: false,
      tags: {
        Name: name,
      },
    }
  );

  return peeringConnection.id;
};

export const acceptPeeringConnection = (name: string, peerId: string) => {
  const peeringConnectionAccepter = new aws.ec2.VpcPeeringConnectionAccepter(
    `peering-acceptor-${peerId}`,
    {
      vpcPeeringConnectionId: peerId,
      autoAccept: true,
      tags: {
        Name: name,
      },
    }
  );

  return peeringConnectionAccepter.id;
};
