// Copyright 2016 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_UI_AVATAR_BUTTON_ERROR_CONTROLLER_H_
#define CHROME_BROWSER_UI_AVATAR_BUTTON_ERROR_CONTROLLER_H_

#include "chrome/browser/ui/avatar_button_error_controller_delegate.h"
#include "components/signin/core/browser/signin_error_controller.h"
#include "components/sync/driver/sync_error_controller.h"

class Profile;

// Keeps track of the signin and sync errors that should be exposed to the user
// in the avatar button.
class AvatarButtonErrorController {
 public:
  AvatarButtonErrorController(AvatarButtonErrorControllerDelegate* delegate,
                              Profile* profile);
  ~AvatarButtonErrorController();

  bool HasAvatarError() const { return has_signin_error_ || has_sync_error_; }

 private:
  friend class SigninErrorObserver;
  friend class SyncErrorObserver;

  // Observes signin errors and updates the error controller for the avatar
  // button accordingly.
  class SigninErrorObserver : public SigninErrorController::Observer {
   public:
    SigninErrorObserver(
        Profile* profile,
        AvatarButtonErrorController* avatar_button_error_controller);
    ~SigninErrorObserver() override;

    // SigninErrorController::Observer:
    void OnErrorChanged() override;

    bool HasSigninError();

   private:
    Profile* profile_;
    AvatarButtonErrorController* avatar_button_error_controller_;

    DISALLOW_COPY_AND_ASSIGN(SigninErrorObserver);
  };

  // Observes sync errors and updates the error controller for the avatar
  // button accordingly.
  class SyncErrorObserver : public syncer::SyncErrorController::Observer {
   public:
    SyncErrorObserver(
        Profile* profile,
        AvatarButtonErrorController* avatar_button_error_controller);
    ~SyncErrorObserver() override;

    // SyncErrorController::Observer:
    void OnErrorChanged() override;

    bool HasSyncError();

   private:
    syncer::SyncErrorController* GetSyncErrorControllerIfNeeded();

    Profile* profile_;
    AvatarButtonErrorController* avatar_button_error_controller_;

    DISALLOW_COPY_AND_ASSIGN(SyncErrorObserver);
  };

  void UpdateSigninError(bool has_signin_error);
  void UpdateSyncError(bool has_sync_error);

  AvatarButtonErrorControllerDelegate* delegate_;

  SigninErrorObserver avatar_signin_error_controller_;
  SyncErrorObserver avatar_sync_error_controller_;

  bool has_signin_error_;
  bool has_sync_error_;

  DISALLOW_COPY_AND_ASSIGN(AvatarButtonErrorController);
};

#endif  // CHROME_BROWSER_UI_AVATAR_BUTTON_ERROR_CONTROLLER_H_
