// Copyright (c) 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.

#include "content/browser/android/date_time_chooser_android.h"

#include "base/android/jni_string.h"
#include "content/common/view_messages.h"
#include "content/public/browser/android/content_view_core.h"
#include "content/public/browser/render_view_host_observer.h"
#include "jni/DateTimeChooserAndroid_jni.h"

using base::android::AttachCurrentThread;
using base::android::ConvertJavaStringToUTF16;
using base::android::ConvertUTF8ToJavaString;


namespace content {

// Updates date/time via IPC to the RenderView
class DateTimeChooserAndroid::DateTimeIPCSender :
    public RenderViewHostObserver {
 public:
  explicit DateTimeIPCSender(RenderViewHost* sender);
  virtual ~DateTimeIPCSender() {}
  void ReplaceDateTime(int dialog_type,
                       int year,
                       int month,
                       int day,
                       int hour,
                       int minute,
                       int second,
                       int milli,
                       int week);
  void CancelDialog();

 private:
  DISALLOW_COPY_AND_ASSIGN(DateTimeIPCSender);
};

DateTimeChooserAndroid::DateTimeIPCSender::DateTimeIPCSender(
    RenderViewHost* sender)
  : RenderViewHostObserver(sender) {
}

void DateTimeChooserAndroid::DateTimeIPCSender::ReplaceDateTime(int dialog_type,
                                                                int year,
                                                                int month,
                                                                int day,
                                                                int hour,
                                                                int minute,
                                                                int second,
                                                                int milli,
                                                                int week) {
  ViewHostMsg_DateTimeDialogValue_Params value;
  value.year = year;
  value.month = month;
  value.day = day;
  value.hour = hour;
  value.minute = minute;
  value.second = second;
  value.milli = milli;
  value.week = week;
  value.dialog_type = dialog_type;
  Send(new ViewMsg_ReplaceDateTime(routing_id(), value));
}

void DateTimeChooserAndroid::DateTimeIPCSender::CancelDialog() {
  Send(new ViewMsg_CancelDateTimeDialog(routing_id()));
}

// DateTimeChooserAndroid implementation
DateTimeChooserAndroid::DateTimeChooserAndroid()
  : sender_(NULL) {
}

DateTimeChooserAndroid::~DateTimeChooserAndroid() {
}

// static
void DateTimeChooserAndroid::InitializeDateInputTypes(
      int text_input_type_date, int text_input_type_date_time,
      int text_input_type_date_time_local, int text_input_type_month,
      int text_input_type_time, int text_input_type_week) {
  JNIEnv* env = AttachCurrentThread();
  Java_DateTimeChooserAndroid_initializeDateInputTypes(
         env,
         text_input_type_date, text_input_type_date_time,
         text_input_type_date_time_local, text_input_type_month,
         text_input_type_time, text_input_type_week);
}

void DateTimeChooserAndroid::ReplaceDateTime(JNIEnv* env,
                                             jobject,
                                             int dialog_type,
                                             int year,
                                             int month,
                                             int day,
                                             int hour,
                                             int minute,
                                             int second,
                                             int milli,
                                             int week) {
  sender_->ReplaceDateTime(
      dialog_type, year, month, day, hour, minute, second, milli, week);
}

void DateTimeChooserAndroid::CancelDialog(JNIEnv* env, jobject) {
  sender_->CancelDialog();
}

void DateTimeChooserAndroid::ShowDialog(ContentViewCore* content,
                                        RenderViewHost* sender,
                                        int type,
                                        int year,
                                        int month,
                                        int day,
                                        int hour,
                                        int minute,
                                        int second,
                                        int milli,
                                        int week,
                                        double min,
                                        double max,
                                        double step) {
  if (sender_)
    delete sender_;
  sender_ = new DateTimeIPCSender(sender);

  JNIEnv* env = AttachCurrentThread();
  j_date_time_chooser_.Reset(Java_DateTimeChooserAndroid_createDateTimeChooser(
      env,
      content->GetJavaObject().obj(),
      reinterpret_cast<intptr_t>(this),
      type,
      year,
      month,
      day,
      hour,
      minute,
      second,
      milli,
      week,
      min,
      max,
      step));
}

// ----------------------------------------------------------------------------
// Native JNI methods
// ----------------------------------------------------------------------------
bool RegisterDateTimeChooserAndroid(JNIEnv* env) {
  bool registered = RegisterNativesImpl(env);
  if (registered)
    DateTimeChooserAndroid::InitializeDateInputTypes(
        ui::TEXT_INPUT_TYPE_DATE,
        ui::TEXT_INPUT_TYPE_DATE_TIME,
        ui::TEXT_INPUT_TYPE_DATE_TIME_LOCAL,
        ui::TEXT_INPUT_TYPE_MONTH,
        ui::TEXT_INPUT_TYPE_TIME,
        ui::TEXT_INPUT_TYPE_WEEK);
  return registered;
}

}  // namespace content
