// Copyright 2010-2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "gui/post_install_dialog/post_install_dialog.h"

#ifdef OS_WIN
#include <windows.h>
#endif

#include <QtGui/QtGui>
#include "base/logging.h"
#include "base/process.h"
#include "base/run_level.h"
#include "base/util.h"
#include "gui/base/setup_util.h"
#include "usage_stats/usage_stats.h"

#ifdef OS_WIN
#include "base/win_util.h"
#include "win32/base/imm_util.h"
#endif

namespace mozc {
namespace gui {
PostInstallDialog::PostInstallDialog()
    : setuputil_(new SetupUtil()) {
  setupUi(this);
  setWindowFlags(Qt::WindowSystemMenuHint |
                 Qt::MSWindowsFixedSizeDialogHint |
                 Qt::WindowStaysOnTopHint);
  setWindowModality(Qt::NonModal);

  QObject::connect(logoffNowButton,
                   SIGNAL(clicked()),
                   this,
                   SLOT(OnLogoffNow()));
  QObject::connect(logoffLaterButton,
                   SIGNAL(clicked()),
                   this,
                   SLOT(OnLogoffLater()));
  QObject::connect(okButton,
                   SIGNAL(clicked()),
                   this,
                   SLOT(OnOk()));
  QObject::connect(setAsDefaultCheckBox,
                   SIGNAL(stateChanged(int)),
                   this,
                   SLOT(OnsetAsDefaultCheckBoxToggled(int)));

  // We change buttons to be displayed depending on the condition this dialog
  // is launched.
  // The following table summarizes which buttons are displayed by conditions.
  //
  // ----------------------------------------------
  // |   OK   | Later  |  Now   |  help  | logoff |
  // ----------------------------------------------
  // |   D    |   N    |   N    |  true  |  true  |
  // |   D    |   N    |   N    |  true  |  false |
  // |   N    |   D    |   D    |  false |  true  |
  // |   D    |   N    |   N    |  false |  false |
  // ----------------------------------------------
  //
  // The followings are meanings of the words used in the table.
  // OK     : okButton
  // Later  : logoffLaterButton
  // Now    : logoffNowButton
  // help   : The result of IsShowHelpPageRequired()
  // logoff : The result of IsLogoffRequired()
  // N      : not displayed
  // D      : displayed
  //
  if (IsShowHelpPageRequired()) {
    usage_stats::UsageStats::IncrementCount("PostInstallShowPageRequired");
    thanksLabel->setText(tr("Thanks for installing.\n"
                            "You need to configure your computer before using "
                            "Mozc. Please follow the "
                            "instructions on the help page."));
    logoffNowButton->setVisible(false);
    logoffLaterButton->setVisible(false);
  } else {
    // Currently, |logoff_required()| always returns false so the following
    // conditional section, which was originally been used for rebooting system
    // to enable CUAS on Windows XP, is now dead code.  If you enable this
    // section again for some reason, please note that OnLogoffNow has not
    // supported Mac nor Linux yet.
    DCHECK(!logoff_required());
    if (logoff_required()) {
      usage_stats::UsageStats::IncrementCount("PostInstallLogoffRequired");
      thanksLabel->setText(tr("Thanks for installing.\nYou must log off before "
                              "using Mozc."));
      // remove OK button and move the other buttons to right.
      const int rows = gridLayout->rowCount();
      const int cols = gridLayout->columnCount();
      okButton->setVisible(false);
      gridLayout->removeWidget(okButton);
      gridLayout->addWidget(logoffNowButton, rows - 1, cols - 2);
      gridLayout->addWidget(logoffLaterButton, rows - 1, cols - 1);
    } else {
      usage_stats::UsageStats::IncrementCount("PostInstallNothingRequired");
      logoffNowButton->setVisible(false);
      logoffLaterButton->setVisible(false);
      gridLayout->removeWidget(logoffNowButton);
      gridLayout->removeWidget(logoffLaterButton);
    }
  }

  // set the default state of migrateDefaultIMEUserDictionaryCheckBox
  const bool status = (!RunLevel::IsElevatedByUAC() &&
                       setuputil_->LockUserDictionary());
  migrateDefaultIMEUserDictionaryCheckBox->setVisible(status);

  // import MS-IME by default
  migrateDefaultIMEUserDictionaryCheckBox->setChecked(true);
}

PostInstallDialog::~PostInstallDialog() {
}

bool PostInstallDialog::logoff_required() {
  // This function always returns false in all platforms.  See b/2899762 for
  // details.
  return false;
}

bool PostInstallDialog::ShowHelpPageIfRequired() {
  if (PostInstallDialog::IsShowHelpPageRequired()) {
    const char kHelpPageUrl[] =
        "http://www.google.com/support/ime/japanese/bin/answer.py?hl=jp&answer="
        "166771";
    return mozc::Process::OpenBrowser(kHelpPageUrl);
  }
  return false;
}

// NOTE(mazda): UsageStats class is not currently multi-process safe so it is
// possible that usagestats is incorrectly collected.
// For example if the user activate Mozc in another application before closing
// this dialog, the usagestats collected in the application can be overwritten
// when this dialog is closed.
// But this case is very rare since this dialog is launched immediately after
// installation.
// So we accept the potential error until this limitation is fixed.
void PostInstallDialog::OnLogoffNow() {
  usage_stats::UsageStats::IncrementCount("PostInstallLogoffNowButton");
  ApplySettings();
#ifdef OS_WIN
  mozc::WinUtil::Logoff();
#else
  // not supported on Mac and Linux
#endif  // OS_WIN
  done(QDialog::Accepted);
}

void PostInstallDialog::OnLogoffLater() {
  usage_stats::UsageStats::IncrementCount("PostInstallLogoffLaterButton");
  ApplySettings();
  done(QDialog::Rejected);
}

void PostInstallDialog::OnOk() {
  usage_stats::UsageStats::IncrementCount("PostInstallOkButton");
  ApplySettings();
  done(QDialog::Accepted);
}

void PostInstallDialog::reject() {
  usage_stats::UsageStats::IncrementCount("PostInstallRejectButton");
  done(QDialog::Rejected);
}

void PostInstallDialog::ApplySettings() {
#ifdef OS_WIN
  uint32 flags = SetupUtil::NONE;
  if (setAsDefaultCheckBox->isChecked()) {
    flags |= SetupUtil::IME_DEFAULT;
  }
  if (IMEHotKeyDisabledCheckBox->isEnabled() &&
      IMEHotKeyDisabledCheckBox->isChecked()) {
    flags |= SetupUtil::DISABLE_HOTKEY;
  }
  if (migrateDefaultIMEUserDictionaryCheckBox->isChecked() &&
      migrateDefaultIMEUserDictionaryCheckBox->isVisible()) {
    flags |= SetupUtil::IMPORT_MSIME_DICTIONARY;
  }
  setuputil_->SetDefaultProperty(flags);
#else
  // not supported on Mac and Linux
#endif  // OS_WIN
}

void PostInstallDialog::OnsetAsDefaultCheckBoxToggled(int state) {
#ifdef OS_WIN
  // IMEHotKey is only activated when setAsDefaultCheckBox is checked.
  IMEHotKeyDisabledCheckBox->setChecked(state);
  IMEHotKeyDisabledCheckBox->setEnabled(static_cast<bool>(state));
#endif
}

bool PostInstallDialog::IsShowHelpPageRequired() {
#ifdef OS_WIN
  return !win32::ImeUtil::IsCtfmonRunning();
#else
  // not supported on Mac and Linux
  return false;
#endif  // OS_WIN
}

}  // namespace gui
}  // namespace mozc
