import { Construct } from 'constructs';
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import { config } from '../../config';
import * as secretsmanager from 'aws-cdk-lib/aws-secretsmanager';

export interface RedisAccessorStackProps extends cdk.StackProps {
  accountStage: string;
}

export class RedisAccessorStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props: RedisAccessorStackProps) {
    super(scope, id, props);

    const vpc = ec2.Vpc.fromLookup(this, 'SunoMainVpc', {
      vpcId: config[`${props.accountStage}`].vpc,
    });

    const externalLayer = lambda.LayerVersion.fromLayerVersionArn(
      this,
      'ImportedLayer',
      'arn:aws:lambda:us-east-2:770693421928:layer:Klayers-p312-psycopg:7'
    );

    const lambdaSubnets = config[`${props.accountStage}`].lambdaSubnets.map((subnetId) => ec2.Subnet.fromSubnetId(this, subnetId, subnetId));

    const secret = secretsmanager.Secret.fromSecretNameV2(this, 'dbsecret', 'app-user-main-db-secret');

    // config for redis generic accessor
    const redisGenericAccessorLayer = new lambda.LayerVersion(this, 'RedisGenericAccessorReqDependences', {
      code: lambda.Code.fromAsset('lambda/redis-generic-accessor/layers', {
        bundling: {
          image: lambda.Runtime.PYTHON_3_12.bundlingImage,
          command: ['bash', '-c', 'pip install -r requirements.txt -t /asset-output/python && ' + 'cp requirements.txt /asset-output/'],
        },
      }),
      compatibleRuntimes: [lambda.Runtime.PYTHON_3_12],
      description: 'Lambda layer with Python dependencies',
    });

    const REDIS_URL =
      props.accountStage === 'prod'
        ? 'redis://redis-cluster-default.9rcjcr.0001.use2.cache.amazonaws.com:6379'
        : 'redis://redis-cluster-default.ic34gd.0001.use2.cache.amazonaws.com:6379';

    const redisGenericAccessor = new lambda.Function(this, 'redisGenericAccessor', {
      runtime: lambda.Runtime.PYTHON_3_12,
      handler: 'redis-generic-accessor.handler',
      code: lambda.Code.fromAsset('lambda/redis-generic-accessor'),
      functionName: 'redis-generic-accessor',
      timeout: cdk.Duration.minutes(1),
      layers: [externalLayer, redisGenericAccessorLayer],
      memorySize: 1024,
      vpc: vpc,
      vpcSubnets: {
        subnets: lambdaSubnets,
      },
      environment: {
        REDIS_URL: REDIS_URL,
      },
    });

    secret.grantRead(redisGenericAccessor);
  }
}
