package com.myorg.springbootdeploy.aws;

import com.myorg.springbootdeploy.k8s.Manifest;
import org.cdk8s.App;
import org.jetbrains.annotations.NotNull;
import software.amazon.awscdk.core.CfnOutput;
import software.amazon.awscdk.core.CfnOutputProps;
import software.amazon.awscdk.services.ecr.assets.DockerImageAsset;
import software.amazon.awscdk.services.ecr.assets.DockerImageAssetProps;
import software.amazon.awscdk.services.eks.*;
import software.constructs.Construct;


public class Stack extends software.amazon.awscdk.core.Stack {

    public Stack(@NotNull Construct scope, @NotNull String id) {
        super(scope, id);

        DockerImageAsset image = new DockerImageAsset(this, "Image", DockerImageAssetProps.builder()
                .directory("image")
                .build());

        Cluster cluster = new Cluster(this, "Cluster", ClusterProps.builder()
                .version(KubernetesVersion.V1_21)
                .albController(AlbControllerOptions.builder()
                        .version(AlbControllerVersion.V2_3_0)
                        .build())
                .build());

        Nodegroup nodeGroup = cluster.getDefaultNodegroup();

        if (nodeGroup != null) {
            image.getRepository().grantPull(cluster.getDefaultNodegroup().getRole());
        }

        Manifest manifest = new Manifest(new App(), "SpringBoot", image.getImageUri());
        cluster.addCdk8sChart("manifest", manifest, KubernetesManifestOptions.builder()
                .ingressAlb(true)
                .ingressAlbScheme(AlbScheme.INTERNET_FACING)
                .build());

        String lbAddress = cluster.getIngressLoadBalancerAddress(manifest.getIngress().getName());

        new CfnOutput(this, "LBAddressValue", CfnOutputProps.builder()
                .value(lbAddress + "/greeting")
                .build());

    }

}