#!/bin/bash

# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# This is a wrapper around a lot of different DBus calls, written in sh; this is
# meant to replace parts of flimflam-test, and also to be callable from crosh.

. /usr/lib/connectivity-common.sh
. /usr/lib/modem-common.sh

# Wait for a modem to reset itself and come back with a new DBus name
# args:
#   $1 - dbus name of the modem before reset
#   $2 - timeout in seconds
wait_for_modem_reset() {
  local modem
  local oldmodem="$1"
  local timeout="$2"
  local status="Timed out"
  echo -n "Waiting..."
  while test ${timeout} -gt 0; do
    modem=$(default_modem)
    if [ -n "${modem}" -a "${modem}" != "${oldmodem}" ]; then
      status="Done"
      break
    fi
    sleep 1
    timeout=$((timeout - 1))
    echo -n "."
  done
  echo "${status}"
}

activate() {
  $(arg_or_default modem $(default_modem))
  [ -z "${modem}" ] && error_exit "No modem found."
  # Work around braindead crosh quoting semantics (i.e., there are none,
  # arguments are tokenized on spaces). Sigh.
  local carrier=$(echo "$@")

  mmcli -m "${modem}" --cdma-activate="${carrier}"
}

connect() {
  $(arg_or_default modem $(default_modem))
  [ -z "${modem}" ] && error_exit "No modem found."
  # Work around braindead quoting again...
  local args=$(echo "$@")

  [ -n "${args}" ] && args="number=${args}"
  mmcli -m "${modem}" --simple-connect="${args}"
}

factory_reset() {
  $(arg_or_default modem $(default_modem))
  [ -z "${modem}" ] && error_exit "No modem found."
  $(arg_or_prompt spc 000000)

  # TODO(benchan): Evaluate if a warning should be given when factory
  # resetting under certain modem configurations.
  mmcli -m "${modem}" --factory-reset="${spc}"
}

reset() {
  $(arg_or_default modem $(default_modem))
  [ -z "${modem}" ] && error_exit "No modem found."

  mmcli -m "${modem}" --reset
  wait_for_modem_reset "${modem}" 40
}

status() {
  all_modem_status 2>/dev/null
}

status_feedback() {
  all_modem_status 2>/dev/null | mask_modem_properties
}

ussd() {
  local modem
  local operation="$1"
  local data="$2"

  $(arg_or_default modem $(default_modem))
  [ -z "${modem}" ] && error_exit "No modem found."

  if [ -z "${operation}" ]; then
    echo "Valid USSD operations are: status, initiate, respond, cancel"
    return
  fi

  case "${operation}" in
    status)
      mmcli -m "${modem}" --3gpp-ussd-status
      ;;
    initiate)
      [ -z "${data}" ] && error_exit "Missing USSD data."
      mmcli -m "${modem}" --3gpp-ussd-initiate="${data}"
      ;;
    respond)
      [ -z "${data}" ] && error_exit "Missing USSD data."
      mmcli -m "${modem}" --3gpp-ussd-respond="${data}"
      ;;
    cancel)
      mmcli -m "${modem}" --3gpp-ussd-cancel
      ;;
    *)
      error_exit "'${operation}' is not valid USSD operation."
      ;;
  esac
}

set_logging() {
  local level="$1"
  local manager

  if [ -z "${level}" ]; then
    echo "Valid logging levels are: debug, info, warn, error"
    return
  fi

  case "${level}" in
    debug|info|warn|error)
      set_modem_manager_logging "${level}"
      ;;
    *)
      error_exit "'${level}' is not a valid logging level."
      ;;
  esac
}

usage() {
  echo "Usage: $(basename $0) <command> [args...]"
  echo "  activate [-modem <modem>] [<carrier>]        Activate modem"
  echo "  connect [-modem <modem>] [phone number]      Connect modem"
  echo "  esim set_test_mode <true/false>              Set hermes to test mode"
  echo "  esim refresh_profiles [-euicc <euicc>]       Get list of profiles " \
    "from eSIM"
  echo "  esim request_pending_profiles [-euicc <euicc>] [smds] " \
    "Get list of pending profiles from SMDS"
  echo "  esim status                                  Display eSIM status"
  echo "  esim install [-euicc <euicc>] <activation> [<confirmation>]" \
    "Install eSIM profile"
  echo "  esim install [-euicc <euicc>] <iccid> [<confirmation>]" \
    "Install an eSIM profile fetched by request_pending_profiles"
  echo "  esim uninstall [-euicc <euicc>] <iccid>      Uninstall eSIM profile"
  echo "  esim enable [-euicc <euicc>] <iccid>         Enable eSIM profile"
  echo "  esim disable [-euicc <euicc>] <iccid>        Disable eSIM profile"
  echo "  factory-reset [-modem <modem>] [<spc>]       Factory-reset the modem"
  echo "  force-flash <device_id>                      Force-flash the modem"
  echo "  reset [-modem <modem>]                       Reset the modem"
  echo "  set-logging (debug|info|warn|error)          Set logging level"
  echo "  status                                       Display modem status"
  echo "  ussd [-modem <modem>] status                " \
    "Show status of ongoing USSD session"
  echo "  ussd [-modem <modem>] initiate <command>     Initiate a USSD session"
  echo "  ussd [-modem <modem>] respond <response>    " \
    "Respond to a USSD request"
  echo "  ussd [-modem <modem>] cancel                " \
    "Cancel ongoing USSD session"
  exit 0
}

$(needarg cmd)
case "${cmd}" in
  activate)
    activate "$@"
    ;;
  connect)
    connect "$@"
    ;;
  esim)
    esim "$@"
    ;;
  factory-reset)
    factory_reset "$@"
    ;;
  force-flash)
    force_flash "$@"
    ;;
  reset)
    reset "$@"
    ;;
  set-logging)
    set_logging "$@"
    ;;
  status)
    status "$@"
    ;;
  status-feedback)
    status_feedback "$@"
    ;;
  ussd)
    ussd "$@"
    ;;
  *)
    usage
    ;;
esac
