pipeline {
    agent any
    triggers {
        githubPush() // This will trigger the pipeline when a new commit is pushed to the 'main' branch.
    } 
    environment {
        // Define your AWS environment variables here
        ECR_REPO_NAME='arsit-ecr-repo'
        ECS_CLUSTER_NAME='arsit-ecs-cluster'
        ECS_SERVICE_NAME='arsit-ecs-service'
        ECS_TASK_DEFINITION='arsit-ecs-task'
        AWS_REGION='eu-west-2'
        
        // Define Linux folder paths for your terraform and applications codes
        JENKINS_WORKSPACE_FOR_TERRAFORMCODES='terraform'
        TERRAFORM_WORKSPACE='/var/lib/jenkins/workspace/iaas/terraform'
        
        // Define Docker image name and version
        DOCKERIMAGE_NAME='pythonapp'
        DOCKERIMAGE_TAG_VERSION='latest'
        DOCKERIMAGE_ID = ''
    }
    
    stages {
        stage('Checkout') {
            steps {
                script {
                    // Checkout the code from GitHub
                    checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'b66dea26-cddc-4ad5-bc33-15595ceebe9f', url: 'https://github.com/semiharsan/pythondemoapp.git']])
                }
            }
        }
        stage('Create ECR Repository') {
            steps {
                script {
                    withCredentials([[
                    $class: 'AmazonWebServicesCredentialsBinding',
                    accessKeyVariable: 'AWS_ACCESS_KEY_ID',
                    secretKeyVariable: 'AWS_SECRET_ACCESS_KEY',
                    credentialsId: 'jenkins'
                    ]]) {
                        sh '''
                            set +e
                            [ -d $JENKINS_WORKSPACE_FOR_TERRAFORMCODES ] && {
                              echo "There is a $JENKINS_WORKSPACE_FOR_TERRAFORMCODES repository here. Let us remove it first"
                              rm -rf $JENKINS_WORKSPACE_FOR_TERRAFORMCODES
                              echo "$JENKINS_WORKSPACE_FOR_TERRAFORMCODES folder removed successfully. Let us download again with the latest version"
                              git clone https://github.com/semiharsan/terraform.git
                              cp -ar $JENKINS_WORKSPACE_FOR_TERRAFORMCODES/* $TERRAFORM_WORKSPACE
                              chown -R jenkins:jenkins $TERRAFORM_WORKSPACE
                            } || {
                              echo "$JENKINS_WORKSPACE_FOR_TERRAFORMCODES folder not found. Let us download it from Git"
                              git clone https://github.com/semiharsan/terraform.git
                              cp -ar $JENKINS_WORKSPACE_FOR_TERRAFORMCODES/* $TERRAFORM_WORKSPACE
                              chown -R jenkins:jenkins $TERRAFORM_WORKSPACE
                              rm -rf $JENKINS_WORKSPACE_FOR_TERRAFORMCODES
                            }
                            set +e
                            if ecrname=$(aws ecr describe-repositories --repository-names $ECR_REPO_NAME --query 'repositories[0].repositoryUri' --output text) > /dev/null 2>&1; then
                                echo "There is an ECR repository with $ecrname name, so let us go to docker build step."
                            else
                              cd $TERRAFORM_WORKSPACE/AWS/ECR
                              terraform init
                              terraform apply -auto-approve
                            fi
                        '''
                    }
                }
            }
        }

        stage('Create ECS') {
            steps {
                script {
                    sh ''' 
                    status=$(aws ecs describe-clusters --clusters $ECS_CLUSTER_NAME --query 'clusters[0].status' --output text)
                    if [ "$status" = "ACTIVE" -o -z "$status" ]; then
                        echo "Cluster is ACTIVE. Let us go to the Docker stage"
                    else
                        echo "Cluster is INACTIVE or None. Let us create it"
                        cd $TERRAFORM_WORKSPACE/AWS/ECS
                        terraform init
                        terraform apply -auto-approve
                    fi
                    '''
                }
            }
        }

        stage('Docker Build And Deploy To ECS') {
            steps {
                script {
                    sh ''' 
                    ecrurl=$(aws ecr describe-repositories --repository-names $ECR_REPO_NAME --query 'repositories[0].repositoryUri' --output text)
                    ecrid=$(aws ecr describe-repositories --repository-names $ECR_REPO_NAME --query 'repositories[0].registryId' --output text)
                    DOCKERIMAGE_ID=$(docker images -q "$DOCKERIMAGE_NAME:$DOCKERIMAGE_TAG_VERSION")
                    if [ -z "$DOCKERIMAGE_ID" ]; then
                        echo "Docker image '$DOCKERIMAGE_NAME' not found. Let us create it"
                    else
                        echo "There is a cocker image with id $DOCKERIMAGE_ID, let us remove it first"
                        docker rmi -f $DOCKERIMAGE_ID
                    fi
                    docker build -t $DOCKERIMAGE_NAME:$DOCKERIMAGE_TAG_VERSION .
                    aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ecrid.dkr.ecr.$AWS_REGION.amazonaws.com
                    docker tag $DOCKERIMAGE_NAME:$DOCKERIMAGE_TAG_VERSION $ecrurl:$DOCKERIMAGE_NAME
                    docker push $ecrurl:$DOCKERIMAGE_NAME
                    aws ecs update-service --cluster $ECS_CLUSTER_NAME --service $ECS_SERVICE_NAME --task-definition $ECS_TASK_DEFINITION --force-new-deployment

                    '''
                }
            }
        } 
    }
}