import * as aws from "@pulumi/aws";
import { Vpc } from "@pulumi/awsx/ec2";
import * as awsNative from "@pulumi/aws-native";
import {
  cacheEngine,
  cacheNodeType,
  cacheNumCacheNodes,
  cacheParameterGroupName,
  cachePort,
  cacheUserName,
  cacheUserPassword,
  renderAccountPrincipal,
} from "./config";

export const createElasticCache = (vpc: Vpc, subnetIds: string[]) => {
  // Create an ElastiCache subnet group
  const subnetGroup = new aws.elasticache.SubnetGroup("cache-subnet-group", {
    subnetIds: subnetIds,
  });

  // Create an ElastiCache security group
  const securityGroup = new aws.ec2.SecurityGroup("cache-sg", {
    name: "cache-sg",
    description: "Allow all inbound traffic for Redis",
    vpcId: vpc.vpcId,
  });

  // Allow all inbound traffic
  new aws.vpc.SecurityGroupIngressRule("cache-sg-ingress", {
    securityGroupId: securityGroup.id,
    ipProtocol: "tcp",
    fromPort: cachePort,
    toPort: cachePort,
    cidrIpv4: "0.0.0.0/0",
  });

  // Create an ElastiCache cluster
  const cluster = new aws.elasticache.Cluster("cache-cluster", {
    engine: cacheEngine,
    nodeType: cacheNodeType,
    numCacheNodes: cacheNumCacheNodes,
    parameterGroupName: cacheParameterGroupName,
    port: cachePort,
    subnetGroupName: subnetGroup.name,
    securityGroupIds: [securityGroup.id],
  });

  // Create an ElastiCache user
  const user = new aws.elasticache.User("my-cache-user", {
    engine: cacheEngine.toUpperCase(),
    userId: cacheUserName,
    userName: cacheUserName,
    passwords: [cacheUserPassword],
    accessString: "on ~* +@all", // grants permission to perform all commands
  });

  return { cluster, user };
};
