import * as cdk from 'aws-cdk-lib';
import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
import { Construct } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import { config } from '../../config'; // Import the configuration

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

export class CloudFrontStack extends cdk.Stack {


  constructor(scope: Construct, id: string, props: CloudFrontStackProps) {
    super(scope, id, props);


    // Create a CloudFront distribution
    const edgeFunction = new cloudfront.experimental.EdgeFunction(this, 'EdgeFunction', {
        runtime: lambda.Runtime.NODEJS_16_X,
        handler: 'index.handler',
        code: lambda.Code.fromInline(`
            exports.handler = (event, context, callback) => {
            const request = event.Records[0].cf.request;
            request.headers.host[0].value = "api.statsig.com";
            return callback(null, request);
            };
        `),
        functionName: 'statsigEdgeFunction',
    });
    const acmCertificateArn = props.accountStage === 'prod'
    ? 'arn:aws:acm:us-east-1:734185074900:certificate/49fbc2a5-7879-4b84-a57e-e134fd4f603d'
    : 'arn:aws:acm:us-east-1:590183763515:certificate/baf9889c-5aaa-4a17-a17f-b7a34e57db85';


    // Create a CloudFront distribution
    const distribution = new cloudfront.CfnDistribution(this, 'StatsigDistribution', {
        distributionConfig: {
            enabled: true,
            origins: [{
                id: 'apiStatsigOrigin',
                domainName: 'api.statsig.com',
                customOriginConfig: {
                    originProtocolPolicy: 'https-only',
                },
            }],
            defaultCacheBehavior: {
                targetOriginId: 'apiStatsigOrigin',
                viewerProtocolPolicy: 'redirect-to-https',
                allowedMethods: ['GET', 'HEAD', 'OPTIONS', 'PUT', 'PATCH', 'POST', 'DELETE'],
                cachedMethods: ['GET', 'HEAD'],
                forwardedValues: {
                queryString: true,
                cookies: {
                    forward: 'all',
                },
                headers: ['*'],
                },
                lambdaFunctionAssociations: [{
                    eventType: 'origin-request',
                    lambdaFunctionArn: edgeFunction.functionArn,
                }],
            },
            aliases: [`s.${props.accountStage}.suno.com`],
            viewerCertificate: {
                acmCertificateArn: acmCertificateArn,
                sslSupportMethod: 'sni-only',
            },
        },
    });

    // Output the CloudFront distribution domain name
    new cdk.CfnOutput(this, 'DistributionDomainName', {
        value: distribution.attrDomainName,
    });


  }
}
