defaults: &defaults
  docker:
    - image: appirio/dx:latest
  working_directory: ~/adx-circle-sfdx-unpackaged

version: 2.0
jobs:
  sonarqube_scan:
    <<: *defaults
    steps:
      - checkout
      - run:
          name: sonarqube_scan
          command: >-
                  sonar-scanner-ee
                  -Dsonar.login=$SONAR_LOGIN
                  -Dsonar.branch.name=$CIRCLE_BRANCH
                  -Dsonar.qualitygate.wait=true
                  -Dsonar.qualitygate.timeout=300

  validate_against_SIT:
    <<: *defaults
    steps:
      - checkout
      - run:
          name: check_metadata_uniqueness
          command: adx metadata:unique --sourcepath force-app/main/default,force-app/sample/metadata
      - run:
          name: validate
          command: adx deploy:source --sourcepath force-app/main/default,force-app/sample/metadata --testdiff --checkonly --targetalias SIT

  deploy_to_SIT:
    <<: *defaults
    steps:
      - checkout
      - run:
          name: check_metadata_uniqueness
          command: adx metadata:unique --sourcepath force-app/main/default,force-app/sample/metadata
      - run:
          name: deploy
          command: adx deploy:source --sourcepath force-app/main/default,force-app/sample/metadata --testdiff --targetalias SIT

  validate_against_UAT:
    <<: *defaults
    steps:
      - checkout
      - run:
          name: check_metadata_uniqueness
          command: adx metadata:unique --sourcepath force-app/main/default,force-app/sample/metadata
      - run:
          name: validate
          command: adx deploy:source --sourcepath force-app/main/default,force-app/sample/metadata --testdiff --checkonly --targetalias UAT

  deploy_to_UAT:
    <<: *defaults
    steps:
      - checkout
      - run:
          name: check_metadata_uniqueness
          command: adx metadata:unique --sourcepath force-app/main/default,force-app/sample/metadata
      - run:
          name: deploy
          command: adx deploy:source --sourcepath force-app/main/default,force-app/sample/metadata --testdiff --targetalias UAT

  validate_against_PROD:
    <<: *defaults
    steps:
      - checkout
      - run:
          name: check_metadata_uniqueness
          command: adx metadata:unique --sourcepath force-app/main/default,force-app/sample/metadata
      - run:
          name: validate
          command: adx deploy:source --sourcepath force-app/main/default,force-app/sample/metadata --testdiff --checkonly --targetalias PROD

  deploy_to_PROD:
    <<: *defaults
    steps:
      - checkout
      - run:
          name: check_metadata_uniqueness
          command: adx metadata:unique --sourcepath force-app/main/default,force-app/sample/metadata
      - run:
          name: deploy
          command: adx deploy:source --sourcepath force-app/main/default,force-app/sample/metadata --testdiff --targetalias PROD

workflows:
  version: 2
  build-and-deploy:
    jobs:
      - sonarqube_scan
      - validate_against_SIT:
          requires:
              - sonarqube_scan
          filters:
             branches:
              only:
                - /^feature\/.*/
      - deploy_to_SIT:
          requires:
              - sonarqube_scan
          filters:
             branches:
              only:
                - SIT
      - validate_against_UAT:
          requires:
              - deploy_to_SIT
          filters:
             branches:
              only:
                - SIT
      - deploy_to_UAT:
          requires:
              - sonarqube_scan
          filters:
             branches:
              only:
                - master
      - validate_against_PROD:
          requires:
              - deploy_to_UAT
          filters:
             branches:
              only:
                - master
      - prepare_for_manual_job:
          type: approval
          filters:
            tags:
              only:
                - /^v[0-9.]+$/
            branches:
              ignore:
                - /.*/
      - deploy_to_PROD:
          requires:
              - prepare_for_manual_job
          filters:
            tags:
              only:
                - /^v[0-9.]+$/
            branches:
              ignore:
                - /.*/
