#!/bin/bash

# This script lints and tests iOS and macOS platform code.

# So that users can run this script from anywhere and it will work as expected.
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
readonly REPO_DIR="$(dirname "$SCRIPT_DIR")"

source "$SCRIPT_DIR/common.sh"

function lint_package() {
  local package_name="$1"
  local package_dir="${REPO_DIR}/packages/$package_name/"
  local failure_count=0

  # These podspecs are temporary multi-platform adoption dummy files.
  local skipped_podspecs=(
    "url_launcher_web.podspec"
    "google_sign_in_web.podspec"
  )
  
  # TODO: These packages have analyzer warnings. Remove plugins from this list as issues are fixed.
  local skip_analysis_packages=(
    "camera.podspec" # https://github.com/flutter/flutter/issues/42673
  )
  find "${package_dir}" -type f -name "*\.podspec" | while read podspec; do
    local podspecBasename=$(basename "${podspec}")
    if [[ "${skipped_podspecs[*]}" =~ "${podspecBasename}" ]]; then
      continue
    fi

    # TODO: Remove --allow-warnings flag https://github.com/flutter/flutter/issues/41444
    local lint_args=(
      lib
      lint
      "${podspec}"
      --allow-warnings
      --fail-fast
      --silent
    )
    if [[ ! "${skip_analysis_packages[*]}" =~ "${podspecBasename}" ]]; then
      lint_args+=(--analyze)
      echo "Linting and analyzing ${podspecBasename}"
    else
      echo "Linting ${podspecBasename}"
    fi

    # Build as frameworks.
    # This will also run any tests set up as a test_spec. See https://blog.cocoapods.org/CocoaPods-1.3.0.
    pod "${lint_args[@]}"
    if [[ "$?" -ne 0 ]]; then
      error "Package ${package_name} has framework issues. Run \"pod lib lint ${podspec} --analyze\" to inspect."
      failure_count+=1
    fi

    # Build as libraries.
    lint_args+=(--use-libraries)
    pod "${lint_args[@]}"
    if [[ "$?" -ne 0 ]]; then
      error "Package ${package_name} has library issues. Run \"pod lib lint ${podspec} --use-libraries --analyze\" to inspect."
      failure_count+=1
    fi
  done

  return "${failure_count}"
}

function lint_packages() {
  if [[ ! "$(which pod)" ]]; then 
    echo "pod not installed. Skipping."
    return
  fi

  local failure_count=0
  for package_name in "$@"; do   
    lint_package "${package_name}"
    failure_count+="$?"
  done

  return "${failure_count}"
}

# Sets CHANGED_PACKAGE_LIST
check_changed_packages

if [[ "${#CHANGED_PACKAGE_LIST[@]}" != 0 ]]; then
  lint_packages "${CHANGED_PACKAGE_LIST[@]}"
fi
