/*
 * Copyright 2020 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 <memory>

#include "hci/address.h"
#include "hci/hci_packets.h"

namespace bluetooth {
namespace l2cap {
namespace classic {

/**
 * This is a proxy for Security Module to unregister itself, or to initiate link connection.
 */
class SecurityInterface {
 public:
  virtual ~SecurityInterface() = default;

  /**
   * Page a remote device for ACL connection, when Security Module needs it for pairing. When the remote device is
   * connected, Security Module will receive a callback through LinkSecurityInterfaceListener.
   */
  virtual void InitiateConnectionForSecurity(hci::Address remote) = 0;

  /**
   * Unregister the security interface and the LinkSecurityInterfaceListener.
   */
  virtual void Unregister() = 0;
};

/**
 * This is a proxy for Security Module to access some link function. This object is passed to Security Module when a
 * link is established.
 */
class LinkSecurityInterface {
 public:
  virtual ~LinkSecurityInterface() = default;

  virtual hci::Address GetRemoteAddress() = 0;

  /**
   * Hold the ACL link connection. Don't disconnect the link until Release() is called.
   */
  virtual void Hold() = 0;

  /**
   * Release the ACL link connection. This doesn't guarantee link disconnection, if other L2cap services are using the
   * link.
   */
  virtual void Release() = 0;

  /**
   * Force the ACL link to disconnect.
   */
  virtual void Disconnect() = 0;

  /**
   * Initiate pairing to HCI layer.
   */
  virtual void EnsureAuthenticated() = 0;

  /**
   * Start encryption on an authenticated link (not necessarily MITM link key).
   */
  virtual void EnsureEncrypted() = 0;

  virtual uint16_t GetAclHandle() = 0;

  virtual hci::Role GetRole() {
    return hci::Role::CENTRAL;
  }
};

class LinkSecurityInterfaceListener {
 public:
  virtual ~LinkSecurityInterfaceListener() = default;

  /**
   * Each time when an ACL link is connected, security manager receives this callback to use LinkSecurityInterface
   * functions.
   */
  virtual void OnLinkConnected(std::unique_ptr<LinkSecurityInterface>) {}

  /**
   * When an ACL link is disconnected, security manager receives this callback. The corresponding LinkSecurityInterface
   * is invalidated then.
   * @param remote
   */
  virtual void OnLinkDisconnected(hci::Address remote) {}

  /**
   * Invoked when AuthenticationComplete event is received for a given link
   */
  virtual void OnAuthenticationComplete(hci::ErrorCode hci_status, hci::Address remote) {}

  /**
   * Invoked when EncryptionChange event is received for a given link
   * @param encrypted
   */
  virtual void OnEncryptionChange(hci::Address remote, bool encrypted) {}
};

}  // namespace classic
}  // namespace l2cap
}  // namespace bluetooth
