orbs:
  node: circleci/node@4.1.0
  ruby: circleci/ruby@1.1.2

version: 2.1

# --------------------------------
# common : executors
# --------------------------------

executors:
  node:
    docker:
      - image: cimg/node:{{ nodeVersion }}
        auth:
          username: $DOCKERHUB_USERNAME
          password: $DOCKERHUB_PASSWORD
  macos:
    macos:
      xcode: {{ xcodeVersion }}
  android:
    docker:
      - image: circleci/android:{{ androidVersion }}
        auth:
          username: $DOCKERHUB_USERNAME
          password: $DOCKERHUB_PASSWORD

# --------------------------------
# common : commands
# --------------------------------

commands:
  lint:
    description: 'Lint'
    steps:
      - run:
          name: 'Lint'
          command: npm run {{ lintCommand }}
  audit:
    description: Audit npm dependencies
    steps:
      - run:
          name: Audit npm dependencies
          command: npm run {{ auditCommand }}
  test:
    description: Run Unit Tests
    steps:
      - run:
          name: Run Unit Tests
          command: npm run {{ testCommand }}
  bundle:
    description: Bundle the js code
    steps:
      - run:
          name: Bundle the ios js code
          command: npm run bundle:ios
      - run:
          name: Bundle the android js code
          command: npm run bundle:android
  deploy:
    description: Deploy the application
    parameters:
      stage:
        type: string
        default: beta
      platform:
        type: string
    steps:
      - run:
          name: Deploy << parameters.stage >> << parameters.platform >> 
          command: npm run deploy:<< parameters.stage >>:<< parameters.platform >>
  setup-node:
    description: Setup the node environment
    steps:
      - node/install:
          node-version: {{ nodeVersion }}
      - node/install-packages:
          cache-version: v1-{{ arch }}
  setup-ruby:
    description: Setup ruby and install packages
    steps:
      - ruby/install-deps:
          key: gems-v1-{{ arch }}
  install-cocoapods:
    description: Install Cocoapods
    steps:
      - run:
          name: Install Cocoapods
          command: |
            cd ios
            bundle exec pod install
            cd ..
  create-keystore:
    description: Create Android keystore file
    steps:
      - run:
          name: Create Android keystore file
          command: npm run create:keystore
jobs:
  deploy-ios:
    executor: macos
    parameters:
      stage:
        type: string
        default: beta
    steps:
      - checkout
      - setup-node
      - setup-ruby
      - install-cocoapods
      - deploy:
          stage: << parameters.stage >>
          platform: ios
  deploy-android:
    executor: android
    parameters:
      stage:
        type: string
        default: beta
    steps:
      - checkout
      - setup-node
      - setup-ruby
      - create-keystore
      - deploy:
          stage: << parameters.stage >>
          platform: android
  push-checks:
    executor: node
    steps:
      - checkout
      - node/install-packages
      - audit
      - lint
      - test
      - bundle

workflows:
  version: 2
  deploy-ios-beta:
    jobs:
      - push-checks:
          context: dockerhub_credentials
          filters:
            branches:
              only:
                - develop
      - deploy-ios:
          stage: beta
          requires:
            - push-checks
  deploy-ios-release:
    jobs:
      - push-checks:
          context: dockerhub_credentials
          filters:
            branches:
              only:
                - main
                - master
      - deploy-ios:
          stage: release
          requires:
            - push-checks
  deploy-android-beta:
    jobs:
      - push-checks:
          context: dockerhub_credentials
          filters:
            branches:
              only:
                - develop
      - deploy-android:
          context: dockerhub_credentials
          stage: beta
          requires:
            - push-checks
  deploy-android-release:
    jobs:
      - push-checks:
          context: dockerhub_credentials
          filters:
            branches:
              only:
                - main
                - master
      - deploy-android:
          context: dockerhub_credentials
          stage: release
          requires:
            - push-checks
  pull-request:
    jobs:
      - push-checks:
          context: dockerhub_credentials
          filters:
            branches:
              ignore:
                - main
                - master
                - develop
