// Copyright 2020 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.

#ifndef POWER_MANAGER_POWERD_POLICY_CELLULAR_CONTROLLER_TROGDOR_H_
#define POWER_MANAGER_POWERD_POLICY_CELLULAR_CONTROLLER_TROGDOR_H_

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

#include <base/macros.h>
#include <base/files/file_descriptor_watcher_posix.h>
#include <base/files/scoped_file.h>
#include <brillo/daemons/dbus_daemon.h>
#include <upstart/dbus-proxies.h>

#include "power_manager/common/power_constants.h"
#include "power_manager/powerd/policy/user_proximity_handler.h"
#include "power_manager/powerd/system/udev.h"
#include "power_manager/powerd/system/udev_subsystem_observer.h"

namespace power_manager {

class PrefsInterface;

namespace policy {

// CellularController initiates power-related changes to the cellular chipset.
class CellularControllerTrogdor : public UserProximityHandler::Delegate {
 public:
  enum class Type {
    kQrtr,
    kMbim,
  };
  struct PacketMetadata {
    uint32_t port;
    uint32_t node;
  };
  // Performs work on behalf of CellularControllerTrogdor.
  class Delegate {
   public:
    virtual ~Delegate() = default;

    // Updates the transmit power to |power| via the dynamic power reduction
    // signal controlled by QMI CLI command.
    virtual void SetCellularTransmitPower(RadioTransmitPower power) = 0;
  };

  CellularControllerTrogdor();
  CellularControllerTrogdor(const CellularControllerTrogdor&) = delete;
  CellularControllerTrogdor& operator=(const CellularControllerTrogdor&) =
      delete;

  ~CellularControllerTrogdor() override;

  // Ownership of raw pointers remains with the caller.
  void Init(Delegate* delegate, PrefsInterface* prefs);

  // Called when the tablet mode changes.
  void HandleTabletModeChange(TabletMode mode);
  void HandleModemStateChange(ModemState state);
  void EmitEvent(const char* event);
  // UserProximityHandler::Delegate overrides:
  void ProximitySensorDetected(UserProximity proximity) override;
  void HandleProximityChange(UserProximity proximity) override;

 private:
  // Updates transmit power via |delegate_|.
  void UpdateTransmitPower();

  RadioTransmitPower DetermineTransmitPower() const;

  // Functions to read modem status from QRTR
  bool InitQrtrSocket();
  void OnFileCanReadWithoutBlocking();
  void OnDataAvailable(CellularControllerTrogdor* cc);
  void ProcessQrtrPacket(uint32_t node, uint32_t port, int size);
  int Recv(void* buf, size_t size, void* metadata);
  int Send(const void* data, size_t size, const void* metadata);
  bool StartServiceLookup(uint32_t service,
                          uint16_t version_major,
                          uint16_t version_minor);
  bool StopServiceLookup(uint32_t service,
                         uint16_t version_major,
                         uint16_t version_minor);

  Delegate* delegate_ = nullptr;  // Not owned.

  TabletMode tablet_mode_ = TabletMode::UNSUPPORTED;
  UserProximity proximity_ = UserProximity::UNKNOWN;
  ModemState state_ = ModemState::UNKNOWN;

  // True if powerd has been configured to set cellular transmit power in
  // response to tablet mode or proximity changes.
  bool set_transmit_power_for_tablet_mode_ = false;
  bool set_transmit_power_for_proximity_ = false;

  base::ScopedFD socket_;
  std::unique_ptr<base::FileDescriptorWatcher::Controller> watcher_;
  std::vector<uint8_t> buffer_;
  std::unique_ptr<com::ubuntu::Upstart0_6Proxy> upstart_proxy_;
};

}  // namespace policy
}  // namespace power_manager

#endif  // POWER_MANAGER_POWERD_POLICY_CELLULAR_CONTROLLER_TROGDOR_H_
