defaults: &defaults
  working_directory: ~/repo

version: 2
jobs:
  lint-testunit:
    <<: *defaults
    docker:
      - image: circleci/node:8

    environment:
      CODECOV_TOKEN: caa771ab-3d45-4756-8e2a-e1f25996fef6

    steps:
      - checkout

      - run:
          name: Install NPM modules
          command: |
            npm install
            npm install codecov

      - run:
          name: Lint
          command: |
            npm run lint

      - run:
          name: Test
          command: |
            npm test

      - run:
          name: Codecov
          command: |
            npx codecov

  android-build:
    <<: *defaults
    docker:
      - image: circleci/android:api-26-alpha

    environment:
      GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx2048m -XX:+HeapDumpOnOutOfMemoryError"
      JVM_OPTS: -Xmx2048m
      TERM: dumb
      BASH_ENV: "~/.nvm/nvm.sh"

    steps:
      - checkout

      - run:
          name: Install Node 8
          command: |
            curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash
            source ~/.nvm/nvm.sh
            nvm install 8

      - restore_cache:
          key: node-modules-{{ checksum ".circleci/config.yml" }}-{{ checksum "package.json" }}

      - run:
          name: Install NPM modules
          command: |
            npm install

      - restore_cache:
          key: android-{{ checksum ".circleci/config.yml" }}-{{ checksum "android/build.gradle" }}-{{ checksum  "android/app/build.gradle" }}

      - run:
          name: Configure Gradle
          command: |
            cd android

            echo $KEYSTORE_BASE64 | base64 --decode > ./app/$KEYSTORE
            echo -e "KEYSTORE=$KEYSTORE" > ./gradle.properties
            echo -e "KEYSTORE_PASSWORD=$KEYSTORE_PASSWORD" >> ./gradle.properties
            echo -e "KEY_ALIAS=$KEY_ALIAS" >> ./gradle.properties
            echo -e "KEY_PASSWORD=$KEYSTORE_PASSWORD" >> ./gradle.properties
            echo -e "VERSIONCODE=$CIRCLE_BUILD_NUM" >> ./gradle.properties

      - run:
          name: Install Android Depedencies
          command: |
            cd android
            ./gradlew androidDependencies

      - run:
          name: Build Android App
          command: |
            cd android
            ./gradlew assembleRelease

            mkdir -p /tmp/build

            mv app/build/outputs /tmp/build/

      - store_artifacts:
          path: /tmp/build/outputs

      - save_cache:
          key: node-modules-{{ checksum ".circleci/config.yml" }}-{{ checksum "package.json" }}
          paths:
            - ./node_modules

      - save_cache:
          key: android-{{ checksum ".circleci/config.yml" }}-{{ checksum "android/build.gradle" }}-{{ checksum  "android/app/build.gradle" }}
          paths:
            - ~/.gradle

  ios-build:
    macos:
      xcode: "8.3.3"

    environment:
      BASH_ENV: "~/.nvm/nvm.sh"

    steps:
      - checkout

      - run:
          name: Install Node 8
          command: |
            curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash
            source ~/.nvm/nvm.sh
            # https://github.com/creationix/nvm/issues/1394
            set +e
            nvm install 8

      - run:
          name: Update Fastlane
          command: |
            brew update
            brew install ruby
            sudo gem install fastlane

      - run:
          name: Install NPM modules
          command: |
            npm install
            npm install react-native

      - run:
          name: Fix known build error
          command: |
            # Fix error https://github.com/facebook/react-native/issues/14382
            cd node_modules/react-native/scripts/
            curl https://raw.githubusercontent.com/facebook/react-native/5c53f89dd86160301feee024bce4ce0c89e8c187/scripts/ios-configure-glog.sh > ios-configure-glog.sh
            chmod +x ios-configure-glog.sh

      - run:
          name: Fastlane Build
          no_output_timeout: 1200
          command: |
            cd ios
            agvtool new-version -all $CIRCLE_BUILD_NUM
            fastlane ios build

      - store_artifacts:
          path: ios/RocketChatRN.ipa

      - persist_to_workspace:
          root: ios
          paths:
            - RocketChatRN.ipa

  ios-testflight:
    macos:
      xcode: "8.3.3"

    steps:
      - checkout

      - attach_workspace:
          at: ios

      - run:
          name: Update Fastlane
          command: |
            brew update
            brew install ruby
            sudo gem install fastlane

      - run:
          name: Fastlane Tesflight Upload
          command: |
            cd ios
            fastlane pilot upload

workflows:
  version: 2
  build-and-test:
    jobs:
      - lint-testunit

      - ios-build:
          requires:
            - lint-testunit
      - ios-hold-testflight:
          type: approval
          requires:
            - ios-build
          filters:
            branches:
              only:
                - develop
                - master
      - ios-testflight:
          requires:
            - ios-hold-testflight

      - android-build:
          requires:
            - lint-testunit