// Copyright 2020 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/ash/child_accounts/time_limits/persisted_app_info.h"

#include "base/containers/contains.h"
#include "base/time/time.h"
#include "base/values.h"
#include "chrome/browser/ash/child_accounts/time_limits/app_types.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace ash {
namespace app_time {

using PersistedAppInfoTest = testing::Test;

TEST_F(PersistedAppInfoTest, RemoveActiveTimes) {
  AppId app = AppId(apps::mojom::AppType::kArc, "1");
  AppState app_state = AppState::kAvailable;
  base::TimeDelta running_active_time = base::TimeDelta::FromHours(5);

  base::Time start_time = base::Time::Now();
  base::TimeDelta activity = base::TimeDelta::FromHours(1);

  AppActivity::ActiveTime to_remove =
      AppActivity::ActiveTime(start_time, start_time + activity);
  AppActivity::ActiveTime to_trim = AppActivity::ActiveTime(
      start_time + 2 * activity, start_time + 3 * activity);
  AppActivity::ActiveTime to_keep = AppActivity::ActiveTime(
      start_time + 4 * activity, start_time + 5 * activity);

  PersistedAppInfo app_info(app, app_state, running_active_time,
                            {{to_remove, to_trim, to_keep}});

  EXPECT_TRUE(base::Contains(app_info.active_times(), to_remove));
  EXPECT_TRUE(base::Contains(app_info.active_times(), to_trim));
  EXPECT_TRUE(base::Contains(app_info.active_times(), to_keep));

  base::Time report_time = start_time + 2.5 * activity;
  app_info.RemoveActiveTimeEarlierThan(report_time);

  EXPECT_EQ(2u, app_info.active_times().size());
  EXPECT_FALSE(base::Contains(app_info.active_times(), to_remove));
  EXPECT_TRUE(base::Contains(app_info.active_times(), to_keep));

  const AppActivity::ActiveTime trimmed(report_time, to_trim.active_to());
  EXPECT_TRUE(base::Contains(app_info.active_times(), trimmed));
}

TEST_F(PersistedAppInfoTest, UpdateAppActivityPreference) {
  AppId app = AppId(apps::mojom::AppType::kArc, "1");
  AppState app_state = AppState::kAvailable;
  base::TimeDelta running_active_time = base::TimeDelta::FromHours(5);

  base::Time start_time = base::Time::Now();
  base::TimeDelta activity = base::TimeDelta::FromHours(1);

  AppActivity::ActiveTime entry1 =
      AppActivity::ActiveTime(start_time, start_time + activity);
  AppActivity::ActiveTime entry2 = AppActivity::ActiveTime(
      start_time + 2 * activity, start_time + 3 * activity);
  AppActivity::ActiveTime entry3 = AppActivity::ActiveTime(
      start_time + 4 * activity, start_time + 5 * activity);

  PersistedAppInfo app_info(app, app_state, running_active_time,
                            {{entry1, entry2, entry3}});
  base::Value entry(base::Value::Type::DICTIONARY);

  app_info.UpdateAppActivityPreference(&entry, /* replace */ false);
  AppActivity::ActiveTime to_append = AppActivity::ActiveTime(
      start_time + 6 * activity, start_time + 7 * activity);
  PersistedAppInfo app_info2(app, app_state, running_active_time,
                             {{to_append}});
  app_info2.UpdateAppActivityPreference(&entry, /* replace */ false);

  absl::optional<PersistedAppInfo> updated_entry =
      PersistedAppInfo::PersistedAppInfoFromDict(
          &entry, /* include_app_activity_array */ true);
  ASSERT_TRUE(updated_entry.has_value());

  const std::vector<AppActivity::ActiveTime>& active_times =
      updated_entry->active_times();

  EXPECT_EQ(active_times.size(), 4u);
  EXPECT_EQ(active_times[0], entry1);
  EXPECT_EQ(active_times[1], entry2);
  EXPECT_EQ(active_times[2], entry3);
  EXPECT_EQ(active_times[3], to_append);

  app_info2.UpdateAppActivityPreference(&entry, /* replace */ true);
  absl::optional<PersistedAppInfo> final_entry =
      PersistedAppInfo::PersistedAppInfoFromDict(
          &entry, /* include_app_activity_array */ true);
  EXPECT_TRUE(final_entry.has_value());
  EXPECT_EQ(final_entry->active_times().size(), 1u);
  EXPECT_EQ(final_entry->active_times()[0], to_append);
}

}  // namespace app_time
}  // namespace ash
