name: 🚀 Deploy to AWS

on:
  workflow_dispatch:
  push:
    branches:
      - master
    tags:
      - '*'
    paths:
      - api/**
      - serverless.yml
      - package.json
      - .github/workflows/deploy-aws.yml

jobs:
  deploy-api:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version: 16

    - name: Cache node_modules
      uses: actions/cache@v4
      with:
        path: node_modules
        key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
        restore-keys: |
          ${{ runner.os }}-yarn-

    - name: Create GitHub deployment for API
      uses: chrnorm/deployment-action@releases/v2
      id: deployment_api
      with:
        token: ${{ secrets.BOT_TOKEN || secrets.GITHUB_TOKEN }}
        environment: AWS (Backend API)
        ref: ${{ github.ref }}
      
    - name: Install Serverless CLI and dependencies
      run: |
        npm i -g serverless
        yarn

    - name: Deploy to AWS
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }}
      run: serverless deploy
      
    - name: Update GitHub deployment status (API)
      if: always()
      uses: chrnorm/deployment-status@v2
      with:
        token: ${{ secrets.BOT_TOKEN || secrets.GITHUB_TOKEN }}
        state: "${{ job.status }}"
        deployment_id: ${{ steps.deployment_api.outputs.deployment_id }}
        ref: ${{ github.ref }}

  deploy-frontend:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version: 16
    
    - name: Cache node_modules
      uses: actions/cache@v4
      with:
        path: node_modules
        key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
        restore-keys: |
          ${{ runner.os }}-yarn-

    - name: Create GitHub deployment for Frontend
      uses: chrnorm/deployment-action@v2
      id: deployment_frontend
      with:
        token: ${{ secrets.BOT_TOKEN || secrets.GITHUB_TOKEN }}
        environment: AWS (Frontend Web UI)
        ref: ${{ github.ref }}
        
    - name: Install dependencies and build
      run: |
        yarn install
        yarn build
    
    - name: Setup AWS
      uses: aws-actions/configure-aws-credentials@v4
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: us-east-1

    - name: Upload to S3
      env:
        AWS_S3_BUCKET: 'web-check-frontend'
      run: aws s3 sync ./build/ s3://$AWS_S3_BUCKET/ --delete

    - name: Invalidate CloudFront cache
      uses: chetan/invalidate-cloudfront-action@v2
      env:
        DISTRIBUTION: E30XKAM2TG9FD8
        PATHS: '/*'
        AWS_REGION: 'us-east-1'
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        
    - name: Update GitHub deployment status (Frontend)
      if: always()
      uses: chrnorm/deployment-status@v2
      with:
        token: ${{ secrets.BOT_TOKEN || secrets.GITHUB_TOKEN }}
        state: "${{ job.status }}"
        deployment_id: ${{ steps.deployment_frontend.outputs.deployment_id }}
        ref: ${{ github.ref }}

