// Copyright 2013 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_WEBUI_CHROMEOS_FIRST_RUN_FIRST_RUN_ACTOR_H_
#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_FIRST_RUN_FIRST_RUN_ACTOR_H_

#include <string>

#include "base/memory/scoped_ptr.h"

namespace base {
class DictionaryValue;
}

namespace chromeos {

class FirstRunActor {
 public:
  class Delegate {
   public:
    virtual ~Delegate() {}

    // Called after actor was initialized.
    virtual void OnActorInitialized() = 0;

    // Called when user clicked "Next" button in step with name |step_name|.
    virtual void OnNextButtonClicked(const std::string& step_name) = 0;

    // Called when user clicked "Keep exploring" button.
    virtual void OnHelpButtonClicked() = 0;

    // Called after setp with |step_name| has been hidden.
    virtual void OnStepHidden(const std::string& step_name) = 0;

    // Called in answer to Finalize() call.
    virtual void OnActorFinalized() = 0;

    // Notifies about about actor destruction.
    virtual void OnActorDestroyed() = 0;
  };

  class StepPosition {
   public:
    // Initializes fields in "non-set" state.
    StepPosition();

    // Setters for properties. Return |*this|.
    StepPosition& SetTop(int top);
    StepPosition& SetRight(int right);
    StepPosition& SetBottom(int bottom);
    StepPosition& SetLeft(int left);

    // Returns DictionaryValue containing set properties.
    scoped_ptr<base::DictionaryValue> AsValue() const;

   private:
    int top_;
    int right_;
    int bottom_;
    int left_;
  };

  FirstRunActor();
  virtual ~FirstRunActor();

  // Returns |true| if actor is initialized. Other public methods can be called
  // only if |IsInitialized| returns |true|.
  virtual bool IsInitialized() = 0;

  // Changes background visibility.
  virtual void SetBackgroundVisible(bool visible) = 0;

  // Adds rectangular hole to background with given position and dimensions.
  virtual void AddRectangularHole(int x, int y, int width, int height) = 0;

  // Adds round hole to background with given position and dimensions.
  virtual void AddRoundHole(int x, int y, float radius) = 0;

  // Removes all holes from background.
  virtual void RemoveBackgroundHoles() = 0;

  // Shows step with given name and position.
  virtual void ShowStepPositioned(const std::string& name,
                                  const StepPosition& position) = 0;

  // Shows step with given name that points to given point.
  virtual void ShowStepPointingTo(const std::string& name,
                                  int x,
                                  int y,
                                  int offset) = 0;

  // Hides currently shown step.
  virtual void HideCurrentStep() = 0;

  // Hides all the UI.
  virtual void Finalize() = 0;

  // Whether actor is finalizing now.
  virtual bool IsFinalizing() = 0;

  void set_delegate(Delegate* delegate) { delegate_ = delegate; }
  Delegate* delegate() const { return delegate_; }

 private:
  Delegate* delegate_;
};

}  // namespace chromeos

#endif  // CHROME_BROWSER_UI_WEBUI_CHROMEOS_FIRST_RUN_FIRST_RUN_ACTOR_H_

