// Copyright 2014 The Chromium 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 CHROME_BROWSER_SIGNIN_EASY_UNLOCK_SCREENLOCK_STATE_HANDLER_H_
#define CHROME_BROWSER_SIGNIN_EASY_UNLOCK_SCREENLOCK_STATE_HANDLER_H_

#include <string>

#include "base/strings/string16.h"
#include "chrome/browser/signin/screenlock_bridge.h"

class PrefService;

// Profile specific class responsible for updating screenlock UI for the user
// associated with the profile when their Easy Unlock state changes.
class EasyUnlockScreenlockStateHandler : public ScreenlockBridge::Observer {
 public:
  // Available Easy Unlock states.
  enum State {
    // Easy Unlock is not enabled, or the screen is not locked.
    STATE_INACTIVE,
    // Bluetooth is not on.
    STATE_NO_BLUETOOTH,
    // Easy Unlock is in process of turning on Bluetooth.
    STATE_BLUETOOTH_CONNECTING,
    // No phones eligible to unlock the device can be found.
    STATE_NO_PHONE,
    // A phone eligible to unlock the device is found, but cannot be
    // authenticated.
    STATE_PHONE_NOT_AUTHENTICATED,
    // A phone eligible to unlock the device is found, but it's locked.
    STATE_PHONE_LOCKED,
    // A phone eligible to unlock the device is found, but does not have lock
    // screen enabled.
    STATE_PHONE_UNLOCKABLE,
    // An Easy Unlock enabled phone is found, but it is not allowed to unlock
    // the device because it does not support reporting it's lock screen state.
    STATE_PHONE_UNSUPPORTED,
    // A phone eligible to unlock the device is found, but its received signal
    // strength is too low, i.e. the phone is roughly more than 30 feet away,
    // and therefore is not allowed to unlock the device.
    STATE_RSSI_TOO_LOW,
    // A phone eligible to unlock the device is found, but the local device's
    // transmission power is too high, indicating that the phone is (probably)
    // more than 1 foot away, and therefore is not allowed to unlock the device.
    STATE_TX_POWER_TOO_HIGH,
    // The device can be unlocked using Easy Unlock.
    STATE_AUTHENTICATED
  };

  // Hard lock states.
  enum HardlockState {
    NO_HARDLOCK = 0,           // Hard lock is not enforced. This is default.
    USER_HARDLOCK = 1 << 0,    // Hard lock is requested by user.
    PAIRING_CHANGED = 1 << 1,  // Hard lock because pairing data is changed.
    NO_PAIRING = 1 << 2,       // Hard lock because there is no pairing data.
    LOGIN_FAILED = 1 << 3,     // Transient hard lock caused by login attempt
                               // failure. Reset when screen is unlocked.
    PAIRING_ADDED = 1 << 4,    // Similar to PAIRING_CHANGED when it happens
                               // on a new Chromebook.
  };

  // |user_email|: The email for the user associated with the profile to which
  //     this class is attached.
  // |initial_hardlock_state|: The initial hardlock state.
  // |screenlock_bridge|: The screenlock bridge used to update the screen lock
  //     state.
  EasyUnlockScreenlockStateHandler(const std::string& user_email,
                                   HardlockState initial_hardlock_state,
                                   ScreenlockBridge* screenlock_bridge);
  ~EasyUnlockScreenlockStateHandler() override;

  // Returns true if handler is not in INACTIVE state.
  bool IsActive() const;

  // Whether the handler is in state that is allowed just after auth failure
  // (i.e. the state that would cause auth failure rather than one caused by an
  // auth failure).
  bool InStateValidOnRemoteAuthFailure() const;

  // Changes internal state to |new_state| and updates the user's screenlock
  // accordingly.
  void ChangeState(State new_state);

  // Updates the screenlock state.
  void SetHardlockState(HardlockState new_state);

  // Shows the hardlock UI if the hardlock_state_ is not NO_HARDLOCK.
  void MaybeShowHardlockUI();

  // Marks the current screenlock state as the one for trial Easy Unlock run.
  void SetTrialRun();

  State state() const { return state_; }

 private:
  // ScreenlockBridge::Observer:
  void OnScreenDidLock() override;
  void OnScreenDidUnlock() override;
  void OnFocusedUserChanged(const std::string& user_id) override;

  // Forces refresh of the Easy Unlock screenlock UI.
  void RefreshScreenlockState();

  void ShowHardlockUI();

  // Updates icon's tooltip options.
  // |trial_run|: Whether the trial Easy Unlock run is in progress.
  void UpdateTooltipOptions(
      bool trial_run,
      ScreenlockBridge::UserPodCustomIconOptions* icon_options);

  // Gets the name to be used for the device. The name depends on the device
  // type (example values: Chromebook and Chromebox).
  base::string16 GetDeviceName();

  // Updates the screenlock auth type if it has to be changed.
  void UpdateScreenlockAuthType();

  State state_;
  std::string user_email_;
  ScreenlockBridge* screenlock_bridge_;

  // State of hardlock.
  HardlockState hardlock_state_;
  bool hardlock_ui_shown_;

  // Whether this is the trial Easy Unlock run. If this is the case, a
  // tutorial message should be shown and hard-locking be disabled. The trial
  // run should be set if the screen was locked by the Easy Unlock setup app.
  bool is_trial_run_;

  DISALLOW_COPY_AND_ASSIGN(EasyUnlockScreenlockStateHandler);
};

#endif  // CHROME_BROWSER_SIGNIN_EASY_UNLOCK_SCREENLOCK_STATE_HANDLER_H_
