# Use the latest 2.1 version of CircleCI pipeline process engine.
# See: https://circleci.com/docs/2.0/configuration-reference
# For a detailed guide to building and testing on Android, read the docs:
# https://circleci.com/docs/2.0/language-android/ for more details.
version: 2.1

# Orbs are reusable packages of CircleCI configuration that you may share across projects, enabling you to create encapsulated, parameterized commands, jobs, and executors that can be used across multiple projects.
# See: https://circleci.com/docs/2.0/orb-intro/
orbs:
  android: circleci/android@2.3.0

commands:
  setup_repo:
    description: checkout repo and android dependencies
    steps:
      - checkout
      - run:
          name: Setup subtree for test data
          command: |
            git config --global user.email "$GIT_EMAIL"
            git config --global user.name "$GIT_EMAIL"
            git subtree add --prefix=driver_app_data https://github.com/hmalik144/driver_app_data main
      # Setup files for build.
      - run:
          name: Setup variables for build
          command: |
            echo "$GOOGLE_SERVICES_KEY" > "app/google-services.json"
      - android/restore-gradle-cache
  run_tests:
    description: run non-instrumentation tests for flavour specified
    parameters:
      flavour:
        type: string
        default: "Driver"
    steps:
      # The next step will run the unit tests
      - run:
          name: Run non-instrumentation unit tests
          command: |
            ./gradlew test<< parameters.flavour >>DebugUnitTest --continue
      - android/save-gradle-cache
      - store_artifacts:
          path: app/build/reports
          destination: reports
      - store_test_results:
          path: app/build/test-results
  run_ui_tests:
    description: start firebase emulator and run ui tests for flavour specified
    parameters:
      flavour:
        type: string
        default: "AtlasWeather"
    steps:
      # Download and cache dependencies
      - restore_cache:
          keys:
            - emulator-cache-v1-
      # Install Firebase tools needed for firebase emulator
      - run:
          name: Install firebase tools
          command: |
            curl -sL firebase.tools | bash
      # Then start the emulator and run the Instrumentation tests!
      - android/start-emulator-and-run-tests:
          post-emulator-launch-assemble-command: ./gradlew assemble<< parameters.flavour >>DebugAndroidTest
          test-command: ./gradlew connected<< parameters.flavour >>DebugAndroidTest
          system-image: system-images;android-25;google_apis;x86
          pull-data: true
          pull-data-path: /storage/emulated/0/Android/data/
          pull-data-target: ~/app-data
          pre-emulator-wait-steps:
            # Start firebase emulator in the background while waiting to start testing
            - run:
                name: Start firebase emulator and while avd starts
                command: |
                  firebase emulators:start --import=driver_app_data/export_directory
                background: true
          post-run-tests-steps:
            # Save cache for firebase tools
            - save_cache:
                paths:
                  - ~/.cache/firebase/emulators/
                key: emulator-cache-v1-{{ epoch }}
      - android/save-gradle-cache
      # store test reports
      - store_artifacts:
          path: app/build/reports/androidTests/connected
          destination: reports
      # store screenshots for failed ui tests
      - store_artifacts:
          path: ~/app-data
          destination: data
      # Then publish the artifacts of the Firebase emulator logs!
      - run:
          name: save firebase emulator logs
          command: |
            mkdir -p tmp/firebase_logs
            cp *.log tmp/firebase_logs
      - store_artifacts:
          path: tmp/firebase_logs
          destination: logs
      # Then publish the results of the Instrumentation tests!
      - store_test_results:
          path: app/build/outputs/androidTest-results/connected
  deploy_to_play_store:
    description: deploy to playstore based on flavour
    parameters:
      flavour:
        type: string
        default: "Driver"
    steps:
      # The next step will run the unit tests
      - run:
          name: Setup keystore
          command: |
            echo "$BASE64_KEYSTORE" | base64 --decode > "app/keystore.jks"
      - android/create-keystore-properties:
          release-keystore: $PWD/app/keystore.jks
      - run:
          name: files list
          command: |
            cd app
            ls
      - run:
          name: Setup playstore key
          command: | 
            echo "$GOOGLE_PLAY_KEY" > "google-play-key.json"
      - run:
          name: Run fastlane command to deploy to playstore
          command: |
            pwd
            bundle exec fastlane deploy<< parameters.flavour >>
      - android/save-gradle-cache
      - store_artifacts:
          path: keystore.properties
          destination: reports
      - store_test_results:
          path: fastlane/report.xml
# Define a job to be invoked later in a workflow.
# See: https://circleci.com/docs/2.0/configuration-reference/#jobs
jobs:
  # Below is the definition of your job to build and test your app, you can rename and customize it as you want.
  build-and-test:
    # Parameters used for determining
    parameters:
      flavour:
        type: string
        default: "Driver"
    # These next lines define the Android machine image executor.
    # See: https://circleci.com/docs/2.0/executor-types/
    executor:
      name: android/android-machine
      tag: 2023.05.1
    # Add steps to the job
    # See: https://circleci.com/docs/2.0/configuration-reference/#steps
    steps:
      # Checkout the code and its submodule as the first step.
      - setup_repo
#      - run_tests:
#          flavour: << parameters.flavour >>
#      - run_ui_tests:
#          flavour: << parameters.flavour >>
  deploy-to-playstore:
    parameters:
      flavour:
        type: string
        default: "Driver"
    docker:
      - image: cimg/android:2023.07-browsers
        auth:
          username: ${DOCKER_USERNAME}
          password: ${DOCKER_PASSWORD}
    steps:
      - setup_repo
      - deploy_to_play_store:
          flavour: << parameters.flavour >>
# Invoke jobs via workflows
# See: https://circleci.com/docs/2.0/configuration-reference/#workflows
workflows:
  version: 2
  build-release-driver:
    jobs:
      - build-and-test:
          flavour: "Driver"
          filters:
            branches:
              ignore:
                - main_admin
                - circleci_branch_filter_fix
      - deploy-to-playstore:
          flavour: "Driver"
          filters:
            branches:
              only:
                - main_driver
                - circleci_branch_filter_fix
#          requires:
#            - build-and-test
#  build-release-admin:
#    jobs:
#      - build-and-test:
#          flavour: "Admin"
#          filters:
#            branches:
#              ignore:
#                - main_driver
#      - android/deploy-to-play-store:
#          filters:
#            branches:
#              only:
#                - main_admin
#          requires:
#            - build-and-test
#          executor:
#            name: android/android-machine
#            tag: 2023.05.1
#          keystore-location: "keystore.jks"
#          lane-name: deployAdmin