// 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.

#include "chrome/browser/ui/apps/directory_access_confirmation_dialog.h"

#include "base/callback.h"
#include "chrome/browser/ui/tab_modal_confirm_dialog.h"
#include "chrome/browser/ui/tab_modal_confirm_dialog_delegate.h"
#include "content/public/browser/web_contents.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"

namespace {

class DirectoryAccessConfirmationDialog : public TabModalConfirmDialogDelegate {
 public:
  DirectoryAccessConfirmationDialog(bool writable,
                                    const base::string16& app_name,
                                    content::WebContents* web_contents,
                                    const base::Closure& on_accept,
                                    const base::Closure& on_cancel);

  virtual base::string16 GetTitle() OVERRIDE;
  virtual base::string16 GetMessage() OVERRIDE;
  virtual base::string16 GetAcceptButtonTitle() OVERRIDE;
  virtual base::string16 GetCancelButtonTitle() OVERRIDE;

 private:
  virtual void OnAccepted() OVERRIDE;
  virtual void OnCanceled() OVERRIDE;
  virtual void OnClosed() OVERRIDE;

  const base::Closure on_accept_;
  const base::Closure on_cancel_;
  const bool writable_;
  const base::string16 app_name_;
};

DirectoryAccessConfirmationDialog::DirectoryAccessConfirmationDialog(
    bool writable,
    const base::string16& app_name,
    content::WebContents* web_contents,
    const base::Closure& on_accept,
    const base::Closure& on_cancel)
    : TabModalConfirmDialogDelegate(web_contents),
      on_accept_(on_accept),
      on_cancel_(on_cancel),
      writable_(writable),
      app_name_(app_name) {}

base::string16 DirectoryAccessConfirmationDialog::GetTitle() {
  return l10n_util::GetStringUTF16(
      IDS_EXTENSIONS_DIRECTORY_CONFIRMATION_DIALOG_TITLE);
}

base::string16 DirectoryAccessConfirmationDialog::GetMessage() {
  if (writable_) {
    return l10n_util::GetStringFUTF16(
        IDS_EXTENSIONS_DIRECTORY_CONFIRMATION_DIALOG_MESSAGE_WRITABLE,
        app_name_);
  } else {
    return l10n_util::GetStringFUTF16(
        IDS_EXTENSIONS_DIRECTORY_CONFIRMATION_DIALOG_MESSAGE_READ_ONLY,
        app_name_);
  }
}

base::string16 DirectoryAccessConfirmationDialog::GetAcceptButtonTitle() {
  return l10n_util::GetStringUTF16(IDS_CONFIRM_MESSAGEBOX_YES_BUTTON_LABEL);
}
base::string16 DirectoryAccessConfirmationDialog::GetCancelButtonTitle() {
  return l10n_util::GetStringUTF16(IDS_CONFIRM_MESSAGEBOX_NO_BUTTON_LABEL);
}

void DirectoryAccessConfirmationDialog::OnAccepted() {
  on_accept_.Run();
}

void DirectoryAccessConfirmationDialog::OnCanceled() {
  on_cancel_.Run();
}

void DirectoryAccessConfirmationDialog::OnClosed() {
  on_cancel_.Run();
}

}  // namespace

void CreateDirectoryAccessConfirmationDialog(bool writable,
                                             const base::string16& app_name,
                                             content::WebContents* web_contents,
                                             const base::Closure& on_accept,
                                             const base::Closure& on_cancel) {
  TabModalConfirmDialog::Create(
      new DirectoryAccessConfirmationDialog(
          writable, app_name, web_contents, on_accept, on_cancel),
      web_contents);
}
