/*
 * Copyright (C) 2016 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.
 */

#ifndef WIFICOND_SERVER_H_
#define WIFICOND_SERVER_H_

#include <memory>
#include <string>
#include <vector>

#include <android-base/macros.h>
#include <wifi_system/interface_tool.h>

#include "android/net/wifi/BnWificond.h"
#include "android/net/wifi/IApInterface.h"
#include "android/net/wifi/IClientInterface.h"
#include "android/net/wifi/IInterfaceEventCallback.h"

#include "wificond/ap_interface_impl.h"
#include "wificond/client_interface_impl.h"
#include "wificond/rtt/rtt_controller_impl.h"

namespace android {
namespace wificond {

class NL80211Packet;
class NetlinkUtils;
class ScanUtils;

struct InterfaceInfo;

class Server : public android::net::wifi::BnWificond {
 public:
  Server(std::unique_ptr<wifi_system::InterfaceTool> if_tool,
         std::unique_ptr<wifi_system::SupplicantManager> supplicant_man,
         std::unique_ptr<wifi_system::HostapdManager> hostapd_man,
         NetlinkUtils* netlink_utils,
         ScanUtils* scan_utils);
  ~Server() override = default;

  android::binder::Status RegisterCallback(
      const android::sp<android::net::wifi::IInterfaceEventCallback>&
          callback) override;
  android::binder::Status UnregisterCallback(
      const android::sp<android::net::wifi::IInterfaceEventCallback>&
          callback) override;

  android::binder::Status registerRttClient(
      const ::android::sp<::android::net::wifi::IRttClient>& rtt_client,
      ::android::sp<::android::net::wifi::IRttController>*
          out_rtt_controller) override;

  android::binder::Status unregisterRttClient(
      const ::android::sp<::android::net::wifi::IRttClient>&
          rttClient) override;

  android::binder::Status createApInterface(
      android::sp<android::net::wifi::IApInterface>*
          created_interface) override;

  android::binder::Status createClientInterface(
      android::sp<android::net::wifi::IClientInterface>*
          created_interface) override;

  android::binder::Status tearDownInterfaces() override;

  android::binder::Status GetClientInterfaces(
      std::vector<android::sp<android::IBinder>>* out_client_ifs) override;
  android::binder::Status GetApInterfaces(
      std::vector<android::sp<android::IBinder>>* out_ap_ifs) override;
  status_t dump(int fd, const Vector<String16>& args) override;

  // Call this once on startup.  It ignores all the invariants held
  // in wificond and tries to restore ourselves to a blank state by
  // killing userspace daemons and cleaning up the interface state.
  void CleanUpSystemState();

 private:
  // Request interface information from kernel and setup local interface object.
  // This assumes that interface should be in STATION mode. Even if we setup
  // interface on behalf of createApInterace(), it is Hostapd that configure
  // the interface to Ap mode later.
  // Returns true on success, false otherwise.
  bool SetupInterface(InterfaceInfo* interface);
  bool RefreshWiphyIndex();
  void LogSupportedBands();
  void OnRegDomainChanged(std::string& country_code);
  void BroadcastClientInterfaceReady(
      android::sp<android::net::wifi::IClientInterface> network_interface);
  void BroadcastApInterfaceReady(
      android::sp<android::net::wifi::IApInterface> network_interface);
  void BroadcastClientInterfaceTornDown(
      android::sp<android::net::wifi::IClientInterface> network_interface);
  void BroadcastApInterfaceTornDown(
      android::sp<android::net::wifi::IApInterface> network_interface);
  void MarkDownAllInterfaces();

  const std::unique_ptr<wifi_system::InterfaceTool> if_tool_;
  const std::unique_ptr<wifi_system::SupplicantManager> supplicant_manager_;
  const std::unique_ptr<wifi_system::HostapdManager> hostapd_manager_;
  NetlinkUtils* const netlink_utils_;
  ScanUtils* const scan_utils_;

  uint32_t wiphy_index_;
  std::vector<std::unique_ptr<ApInterfaceImpl>> ap_interfaces_;
  std::vector<std::unique_ptr<ClientInterfaceImpl>> client_interfaces_;
  std::vector<android::sp<android::net::wifi::IInterfaceEventCallback>>
      interface_event_callbacks_;

  std::unique_ptr<RttControllerImpl> rtt_controller_;

  // Cached interface list from kernel.
  std::vector<InterfaceInfo> interfaces_;

  DISALLOW_COPY_AND_ASSIGN(Server);
};

}  // namespace wificond
}  // namespace android

#endif  // WIFICOND_SERVER_H_
