name: CI-CD

on:
  push:
    branches:
      - master
      - migration

permissions:
  id-token: write
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest

    outputs:
      version: ${{ steps.package.outputs.version }}

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

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: 18
          registry-url: https://registry.npmjs.org/

      - name: Cache node_modules
        uses: actions/cache@v4
        with:
          path: node_modules
          key: node-${{ hashFiles('package.json') }}

      - name: Install Dependencies
        run: npm install

      - name: Build
        run: npm run build

      - name: Format Check
        run: npm run format:check || echo "Formatting issues found"

      - name: Lint
        run: npm run lint

      - name: Test
        run: npm test

      - name: Extract Version
        id: package
        run: echo "version=$(jq -r .version package.json)" >> $GITHUB_OUTPUT

      - name: Upload Build Artifact
        uses: actions/upload-artifact@v4
        with:
          name: build
          path: dist/

  publish-npm:
    needs: [build, publish-cdn-dev]
    if: github.ref_name == 'master'
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: 18
          registry-url: https://registry.npmjs.org/

      - uses: actions/download-artifact@v4
        with:
          name: build
          path: dist/

      - name: Publish to NPM
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
        run: npm publish

  publish-cdn-dev:
    needs: build
    if: github.ref_name == 'master' || endsWith(github.ref_name, '__dev')
    runs-on: self-hosted
    environment:
      name: dev

    permissions:
      contents: read

    steps:
      - uses: actions/checkout@v4
      - uses: actions/download-artifact@v4
        with:
          name: build
          path: dist/
      - name: Install AWS CLI
        run: |
          sudo apt-get update
          sudo apt-get install -y unzip
          curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
          unzip awscliv2.zip
          sudo ./aws/install
          aws --version

      - name: Configure AWS Credentials (OIDC Recommended)
        uses: aws-actions/configure-aws-credentials@v5
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
          aws-region: us-east-1
          mask-aws-account-id: 'false'
          role-skip-session-tagging: true

      - name: Upload to Dev S3
        run: |
          VERSION=$(jq -r .version package.json)
          aws s3 cp ./dist/rentdynamics.$VERSION.js s3://${{ secrets.DEV_S3_BUCKET }}

      - name: Invalidate Dev CloudFront
        run: |
          aws cloudfront create-invalidation \
            --distribution-id ${{ secrets.DEV_CF_DISTRIBUTION }} \
            --paths "/*"

  publish-cdn-prod:
    needs: [publish-npm, publish-cdn-dev]
    if: github.ref_name == 'master'
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
      - uses: actions/download-artifact@v4
        with:
          name: build
          path: dist/

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
          aws-region: us-east-1

      - name: Upload to Prod S3
        run: |
          VERSION=$(jq -r .version package.json)
          aws s3 cp ./dist/rentdynamics.$VERSION.js s3://${{ secrets.CDNJS_BUCKET_NAME }}

      - name: Invalidate Prod CloudFront
        run: |
          aws cloudfront create-invalidation \
            --distribution-id ${{ secrets.CDNJS_DISTRIBUTION_ID }} \
            --paths "/*"
