#!/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 use_test_certs <true/false>             Use test certs for TLS"
  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
