// 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 GIN_MODULES_TIMER_H_
#define GIN_MODULES_TIMER_H_

#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/timer/timer.h"
#include "gin/gin_export.h"
#include "gin/handle.h"
#include "gin/runner.h"
#include "gin/wrappable.h"
#include "v8/include/v8.h"

namespace gin {

class ObjectTemplateBuilder;

// A simple scriptable timer that can work in one-shot or repeating mode.
class GIN_EXPORT Timer : public Wrappable<Timer> {
 public:
  enum TimerType {
    TYPE_ONE_SHOT,
    TYPE_REPEATING
  };

  static WrapperInfo kWrapperInfo;
  static Handle<Timer> Create(TimerType type, v8::Isolate* isolate,
                              int delay_ms, v8::Local<v8::Function> function);

  ObjectTemplateBuilder GetObjectTemplateBuilder(v8::Isolate* isolate) override;

 private:
  Timer(v8::Isolate* isolate, bool repeating, int delay_ms,
        v8::Local<v8::Function> function);
  ~Timer() override;
  void OnTimerFired();

  base::Timer timer_;
  base::WeakPtr<gin::Runner> runner_;
  base::WeakPtrFactory<Timer> weak_factory_;

  DISALLOW_COPY_AND_ASSIGN(Timer);
};


class GIN_EXPORT TimerModule : public Wrappable<TimerModule> {
 public:
  static const char kName[];
  static WrapperInfo kWrapperInfo;
  static Handle<TimerModule> Create(v8::Isolate* isolate);
  static v8::Local<v8::Value> GetModule(v8::Isolate* isolate);

 private:
  TimerModule();
  ~TimerModule() override;

  ObjectTemplateBuilder GetObjectTemplateBuilder(v8::Isolate* isolate) override;
};

}  // namespace gin

#endif  // GIN_MODULES_TIMER_H_
