# to validate any changes
# use:
# circleci config process .circleci/config.yml > config_processed.yml
#
version: 2.1
parameters:
  pr_workflow:    # runs for every pull request.
    type: boolean
    default: true # by default pr workflow will get executed.
  custom_workflow: # runs just one custom config.
    type: boolean
    default: false
  release_workflow: # release tool kicks of this workflow with release_command parameter.
    type: boolean
    default: false
  browser:
    type: enum
    enum: ["chrome", "firefox"]
    default: "chrome"
  bver:
    type: enum
    enum: ["stable", "beta", "unstable"]
    default: "stable"
  release_command:
    type: string
    default: "echo no release command was specified" # release-tool specifies the real command.
  tag:
    type: string
    default: "" # use something like: "2.0.0-beta15" when invoking with parameters.

executors:
  docker-with-browser:
    parameters:
      browser:
        type: enum
        enum: ["chrome", "firefox"]
        default: "chrome"
      bver:
        type: enum
        enum: ["stable", "beta", "unstable"]
        default: "stable"
    docker:
      - image: twilio/twilio-video-browsers:<<parameters.browser>>-<<parameters.bver>>
commands:
  get-code:
    steps:
      - checkout
      - when:
          condition: << pipeline.parameters.tag >>
          steps:
            - run: git checkout << pipeline.parameters.tag >>
  get-code-and-dependencies:
    steps:
      - get-code
      - restore_cache:
          key: dependency-cache-{{ arch }}-{{ checksum "package.json" }}
      - run:
          name: Installing dependencies
          command: npm install
      - save_cache:
          key: dependency-cache-{{ checksum "package.json" }}
          paths:
            - ./node_modules
  save-test-results:
    steps:
      - store_test_results:
          path: ./logs
      - store_artifacts:
          path: ./logs
          prefix: tests
  lint:
    steps:
      - run:
          name: Running Lint
          command: npm run lint
  unit-tests:
    steps:
      - run:
          name: Running Unit Tests
          command: npm run test:unit
      - store_artifacts:
          path: ./coverage
          prefix: coverage
  integration-tests:
    steps:
      - run:
          name: Running Integration Tests
          command: npm run test:integration
      - save-test-results
  run-tests:
    steps:
      - get-code-and-dependencies
      - lint
      - unit-tests
      - integration-tests
jobs:
  run-tests-job:
    parameters:
      browser:
        type: string
      bver:
        type: string
    executor:
      name: docker-with-browser
      browser: << parameters.browser >>
      bver: << parameters.bver >>
    steps: [run-tests]

  ExecuteRelease:
    executor: docker-with-browser
    parameters:
      dryRun:
        type: boolean
        default: true
    steps:
      - get-code-and-dependencies
      - lint
      - unit-tests
      - when:
          condition: << parameters.dryRun >>
          steps:
            - run: echo Wait for other jobs in the workflow to finish
            - run: echo Release will execute "<< pipeline.parameters.release_command >>"
      - unless:
          condition: << parameters.dryRun >>
          steps:
            - run: << pipeline.parameters.release_command >>

workflows:
  version: 2
  Custom_Workflow:
    when: << pipeline.parameters.custom_workflow >>
    jobs:
      - run-tests-job:
          name: << pipeline.parameters.browser >>(<< pipeline.parameters.bver >>)
          browser: << pipeline.parameters.browser >>
          bver: << pipeline.parameters.bver >>
  Pull_Request_Workflow:
    when: << pipeline.parameters.pr_workflow >>
    jobs:
      - run-tests-job:
          name: << matrix.browser >>(<< matrix.bver >>)
          matrix:
            parameters:
              browser: ["chrome", "firefox"]
              bver: ["stable", "unstable", "beta"]
  Release_Workflow:
    when: << pipeline.parameters.release_workflow >>
    jobs:
      - run-tests-job:
          name: << matrix.browser >>(<< matrix.bver >>)
          matrix:
            parameters:
              browser: ["chrome", "firefox"]
              bver: ["stable", "unstable", "beta"]
      - ExecuteRelease:
          dryRun: true
          name: Release dry run
      - hold:
          type: approval
          requires: [Release dry run]
      - ExecuteRelease:
          dryRun: false
          context: sdk_js
          requires: [hold]
