// Copyright 2016 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 "ash/system/date/tray_system_info.h"

#include "ash/shelf/shelf.h"
#include "ash/shell.h"
#include "ash/system/date/date_view.h"
#include "ash/system/date/system_info_default_view.h"
#include "ash/system/system_clock_observer.h"
#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/system_tray_notifier.h"
#include "ash/system/tray/tray_item_view.h"

namespace ash {

TraySystemInfo::TraySystemInfo(SystemTray* system_tray)
    : SystemTrayItem(system_tray, UMA_DATE),
      tray_view_(nullptr),
      default_view_(nullptr),
      login_status_(LoginStatus::NOT_LOGGED_IN),
      system_clock_observer_(new SystemClockObserver()) {
  Shell::Get()->system_tray_notifier()->AddClockObserver(this);
}

TraySystemInfo::~TraySystemInfo() {
  Shell::Get()->system_tray_notifier()->RemoveClockObserver(this);
}

const tray::TimeView* TraySystemInfo::GetTimeTrayForTesting() const {
  return tray_view_;
}

const SystemInfoDefaultView* TraySystemInfo::GetDefaultViewForTesting() const {
  return default_view_;
}

views::View* TraySystemInfo::CreateDefaultViewForTesting(LoginStatus status) {
  return CreateDefaultView(status);
}

views::View* TraySystemInfo::CreateTrayView(LoginStatus status) {
  CHECK(tray_view_ == nullptr);
  tray::TimeView::ClockLayout clock_layout =
      system_tray()->shelf()->IsHorizontalAlignment()
          ? tray::TimeView::ClockLayout::HORIZONTAL_CLOCK
          : tray::TimeView::ClockLayout::VERTICAL_CLOCK;
  tray_view_ = new tray::TimeView(clock_layout);
  views::View* view = new TrayItemView(this);
  view->AddChildView(tray_view_);
  return view;
}

views::View* TraySystemInfo::CreateDefaultView(LoginStatus status) {
  default_view_ = new SystemInfoDefaultView(this);

  // Save the login status we created the view with.
  login_status_ = status;

  OnSystemClockCanSetTimeChanged(system_clock_observer_->can_set_time());
  return default_view_;
}

void TraySystemInfo::OnTrayViewDestroyed() {
  tray_view_ = nullptr;
}

void TraySystemInfo::OnDefaultViewDestroyed() {
  default_view_ = nullptr;
}

void TraySystemInfo::UpdateAfterShelfAlignmentChange() {
  if (tray_view_) {
    tray::TimeView::ClockLayout clock_layout =
        system_tray()->shelf()->IsHorizontalAlignment()
            ? tray::TimeView::ClockLayout::HORIZONTAL_CLOCK
            : tray::TimeView::ClockLayout::VERTICAL_CLOCK;
    tray_view_->UpdateClockLayout(clock_layout);
  }
}

void TraySystemInfo::OnDateFormatChanged() {
  UpdateTimeFormat();
}

void TraySystemInfo::OnSystemClockTimeUpdated() {
  UpdateTimeFormat();
}

void TraySystemInfo::OnSystemClockCanSetTimeChanged(bool can_set_time) {
  // Outside of a logged-in session, the date button should launch the set time
  // dialog if the time can be set.
  if (default_view_ && login_status_ == LoginStatus::NOT_LOGGED_IN) {
    default_view_->GetDateView()->SetAction(
        can_set_time ? tray::DateView::DateAction::SET_SYSTEM_TIME
                     : tray::DateView::DateAction::NONE);
  }
}

void TraySystemInfo::Refresh() {
  if (tray_view_)
    tray_view_->UpdateText();
}

void TraySystemInfo::UpdateTimeFormat() {
  if (tray_view_)
    tray_view_->UpdateTimeFormat();
  if (default_view_)
    default_view_->GetDateView()->UpdateTimeFormat();
}

}  // namespace ash
