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

#include "pciguard/session_monitor.h"
#include <base/bind.h>
#include <base/logging.h>

namespace pciguard {

namespace {

void OnSignalConnected(const std::string& interface,
                       const std::string& signal,
                       bool success) {
  if (!success) {
    LOG(ERROR) << "Could not connect to session signal " << signal
               << "on interface " << interface;
    exit(EXIT_FAILURE);
  }
}

}  // namespace

SessionMonitor::SessionMonitor(scoped_refptr<dbus::Bus> bus,
                               EventHandler* ev_handler)
    : proxy_(bus), event_handler_(ev_handler), weak_ptr_factory_(this) {
  proxy_.RegisterScreenIsLockedSignalHandler(
      base::BindRepeating(&SessionMonitor::OnScreenIsLocked,
                          weak_ptr_factory_.GetWeakPtr()),
      base::BindOnce(&OnSignalConnected));
  proxy_.RegisterScreenIsUnlockedSignalHandler(
      base::BindRepeating(&SessionMonitor::OnScreenIsUnlocked,
                          weak_ptr_factory_.GetWeakPtr()),
      base::BindOnce(&OnSignalConnected));
  proxy_.RegisterSessionStateChangedSignalHandler(
      base::BindRepeating(&SessionMonitor::OnSessionStateChanged,
                          weak_ptr_factory_.GetWeakPtr()),
      base::BindOnce(&OnSignalConnected));
}

void SessionMonitor::OnScreenIsLocked() {
  event_handler_->OnScreenLocked();
}

void SessionMonitor::OnScreenIsUnlocked() {
  event_handler_->OnScreenUnlocked();
}

void SessionMonitor::OnSessionStateChanged(const std::string& state) {
  LOG(INFO) << __func__ << "Session state changed, new state = " << state;

  if (state == "started") {
    // Ignore Guest sessions.
    bool is_guest;
    brillo::ErrorPtr error;
    proxy_.IsGuestSessionActive(&is_guest, &error);
    if (error || is_guest) {
      LOG(INFO) << "Ignoring Guest session (error=" << error
                << ", is_guest=" << is_guest << ")";
      return;
    }

    event_handler_->OnUserLogin();

  } else if (state == "stopping") {
    event_handler_->OnUserLogout();
  }
}

}  // namespace pciguard
