/*
 * Copyright 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <raw_address.h>

#include "bt_hf.h"

namespace bluetooth {
namespace headset {

/**
 * Headset related callbacks invoked from from the Bluetooth native stack
 * All callbacks are invoked on the JNI thread
 */
class Callbacks {
 public:
  virtual ~Callbacks() = default;
  /**
   * Callback for connection state change.
   *
   * @param state one of the values from bthf_connection_state_t
   * @param bd_addr remote device address
   */
  virtual void ConnectionStateCallback(bthf_connection_state_t state,
                                       RawAddress* bd_addr) = 0;

  /**
   * Callback for audio connection state change.
   *
   * @param state one of the values from bthf_audio_state_t
   * @param bd_addr remote device address
   */
  virtual void AudioStateCallback(bthf_audio_state_t state,
                                  RawAddress* bd_addr) = 0;

  /**
   * Callback for VR connection state change.
   *
   * @param state one of the values from bthf_vr_state_t
   * @param bd_addr
   */
  virtual void VoiceRecognitionCallback(bthf_vr_state_t state,
                                        RawAddress* bd_addr) = 0;

  /**
   * Callback for answer incoming call (ATA)
   *
   * @param bd_addr remote device address
   */
  virtual void AnswerCallCallback(RawAddress* bd_addr) = 0;

  /**
   * Callback for disconnect call (AT+CHUP)
   *
   * @param bd_addr remote device address
   */
  virtual void HangupCallCallback(RawAddress* bd_addr) = 0;

  /**
   * Callback for disconnect call (AT+CHUP)
   *
   * @param type denote Speaker/Mic gain bthf_volume_type_t
   * @param volume volume value 0 to 15, p69, HFP 1.7.1 spec
   * @param bd_addr remote device address
   */
  virtual void VolumeControlCallback(bthf_volume_type_t type, int volume,
                                     RawAddress* bd_addr) = 0;

  /**
   * Callback for dialing an outgoing call
   *
   * @param number intended phone number, if number is NULL, redial
   * @param bd_addr remote device address
   */
  virtual void DialCallCallback(char* number, RawAddress* bd_addr) = 0;

  /**
   * Callback for sending DTMF tones
   *
   * @param tone contains the dtmf character to be sent
   * @param bd_addr remote device address
   */
  virtual void DtmfCmdCallback(char tone, RawAddress* bd_addr) = 0;

  /**
   * Callback for enabling/disabling noise reduction/echo cancellation
   *
   * @param nrec 1 to enable, 0 to disable
   * @param bd_addr remote device address
   */
  virtual void NoiseReductionCallback(bthf_nrec_t nrec,
                                      RawAddress* bd_addr) = 0;

  /**
   * Callback for AT+BCS and event from BAC
   *
   * @param wbs WBS enable, WBS disable
   * @param bd_addr remote device address
   */
  virtual void WbsCallback(bthf_wbs_config_t wbs, RawAddress* bd_addr) = 0;

  /**
   * Callback for call hold handling (AT+CHLD)
   *
   * @param chld the call hold command (0, 1, 2, 3)
   * @param bd_addr remote device address
   */
  virtual void AtChldCallback(bthf_chld_type_t chld, RawAddress* bd_addr) = 0;

  /**
   * Callback for CNUM (subscriber number)
   *
   * @param bd_addr remote device address
   */
  virtual void AtCnumCallback(RawAddress* bd_addr) = 0;

  /**
   * Callback for indicators (CIND)
   *
   * @param bd_addr remote device address
   */
  virtual void AtCindCallback(RawAddress* bd_addr) = 0;

  /**
   * Callback for operator selection (COPS)
   *
   * @param bd_addr remote device address
   */
  virtual void AtCopsCallback(RawAddress* bd_addr) = 0;

  /**
   * Callback for call list (AT+CLCC)
   *
   * @param bd_addr remote device address
   */
  virtual void AtClccCallback(RawAddress* bd_addr) = 0;

  /**
   * Callback for unknown AT command recd from HF
   *
   * @param at_string he unparsed AT string
   * @param bd_addr remote device address
   */
  virtual void UnknownAtCallback(char* at_string, RawAddress* bd_addr) = 0;

  /**
   * Callback for keypressed (HSP) event.
   *
   * @param bd_addr remote device address
   */
  virtual void KeyPressedCallback(RawAddress* bd_addr) = 0;

  /**
   * Callback for BIND. Pass the remote HF Indicators supported.
   *
   * @param at_string unparsed AT command string
   * @param bd_addr remote device address
   */
  virtual void AtBindCallback(char* at_string, RawAddress* bd_addr) = 0;

  /**
   * Callback for BIEV. Pass the change in the Remote HF indicator values
   *
   * @param ind_id HF indicator id
   * @param ind_value HF indicator value
   * @param bd_addr remote device address
   */
  virtual void AtBievCallback(bthf_hf_ind_type_t ind_id, int ind_value,
                              RawAddress* bd_addr) = 0;

  /**
   * Callback for BIA. Pass the change in AG indicator activation.
   * NOTE: Call, Call Setup and Call Held indicators are mandatory and cannot
   *       be disabled. Thus, they are not included here.
   *
   * @param service whether HF should receive network service state update
   * @param roam whether HF should receive roaming state update
   * @param signal whether HF should receive signal strength update
   * @param battery whether HF should receive AG battery level update
   * @param bd_addr remote HF device address
   */
  virtual void AtBiaCallback(bool service, bool roam, bool signal, bool battery,
                             RawAddress* bd_addr) = 0;
};

}  // namespace headset
}  // namespace bluetooth
