// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/feed/core/v2/enums.h"

#include <ostream>
#include <string_view>

namespace feed {

// Included for debug builds only for reduced binary size.

std::ostream& operator<<(std::ostream& out, NetworkRequestType value) {
#ifndef NDEBUG
  switch (value) {
    case NetworkRequestType::kFeedQuery:
      return out << "kFeedQuery";
    case NetworkRequestType::kUploadActions:
      return out << "kUploadActions";
    case NetworkRequestType::kNextPage:
      return out << "kNextPage";
    case NetworkRequestType::kQueryInteractiveFeed:
      return out << "kQueryInteractiveFeed";
    case NetworkRequestType::kQueryBackgroundFeed:
      return out << "kQueryBackgroundFeed";
    case NetworkRequestType::kQueryNextPage:
      return out << "kQueryNextPage";
  }
#endif
  return out << (static_cast<int>(value));
}

std::ostream& operator<<(std::ostream& out, LoadStreamStatus value) {
#ifndef NDEBUG
  switch (value) {
    case LoadStreamStatus::kNoStatus:
      return out << "kNoStatus";
    case LoadStreamStatus::kLoadedFromStore:
      return out << "kLoadedFromStore";
    case LoadStreamStatus::kLoadedFromNetwork:
      return out << "kLoadedFromNetwork";
    case LoadStreamStatus::kFailedWithStoreError:
      return out << "kFailedWithStoreError";
    case LoadStreamStatus::kNoStreamDataInStore:
      return out << "kNoStreamDataInStore";
    case LoadStreamStatus::kModelAlreadyLoaded:
      return out << "kModelAlreadyLoaded";
    case LoadStreamStatus::kNoResponseBody:
      return out << "kNoResponseBody";
    case LoadStreamStatus::kProtoTranslationFailed:
      return out << "kProtoTranslationFailed";
    case LoadStreamStatus::kDataInStoreIsStale:
      return out << "kDataInStoreIsStale";
    case LoadStreamStatus::kDataInStoreIsStaleTimestampInFuture:
      return out << "kDataInStoreIsStaleTimestampInFuture";
    case LoadStreamStatus::
        kCannotLoadFromNetworkSupressedForHistoryDelete_DEPRECATED:
      return out
             << "kCannotLoadFromNetworkSupressedForHistoryDelete_DEPRECATED";
    case LoadStreamStatus::kCannotLoadFromNetworkOffline:
      return out << "kCannotLoadFromNetworkOffline";
    case LoadStreamStatus::kCannotLoadFromNetworkThrottled:
      return out << "kCannotLoadFromNetworkThrottled";
    case LoadStreamStatus::kLoadNotAllowedEulaNotAccepted:
      return out << "kLoadNotAllowedEulaNotAccepted";
    case LoadStreamStatus::kLoadNotAllowedArticlesListHidden:
      return out << "kLoadNotAllowedArticlesListHidden";
    case LoadStreamStatus::kCannotParseNetworkResponseBody:
      return out << "kCannotParseNetworkResponseBody";
    case LoadStreamStatus::kLoadMoreModelIsNotLoaded:
      return out << "kLoadMoreModelIsNotLoaded";
    case LoadStreamStatus::kLoadNotAllowedDisabledByEnterprisePolicy:
      return out << "kLoadNotAllowedDisabledByEnterprisePolicy";
    case LoadStreamStatus::kNetworkFetchFailed:
      return out << "kNetworkFetchFailed";
    case LoadStreamStatus::kCannotLoadMoreNoNextPageToken:
      return out << "kCannotLoadMoreNoNextPageToken";
    case LoadStreamStatus::kDataInStoreStaleMissedLastRefresh:
      return out << "kDataInStoreStaleMissedLastRefresh";
    case LoadStreamStatus::kLoadedStaleDataFromStoreDueToNetworkFailure:
      return out << "kLoadedStaleDataFromStoreDueToNetworkFailure";
    case LoadStreamStatus::kDataInStoreIsExpired:
      return out << "kDataInStoreIsExpired";
    case LoadStreamStatus::kDataInStoreIsForAnotherUser:
      return out << "kDataInStoreIsForAnotherUser";
    case LoadStreamStatus::kAbortWithPendingClearAll:
      return out << "kAbortWithPendingClearAll";
    case LoadStreamStatus::kAlreadyHaveUnreadContent:
      return out << "kAlreadyHaveUnreadContent";
    case LoadStreamStatus::kNotAWebFeedSubscriber_DEPRECATED:
      return out << "kNotAWebFeedSubscriber_DEPRECATED";
    case LoadStreamStatus::kAccountTokenFetchFailedWrongAccount:
      return out << "kAccountTokenFetchFailedWrongAccount";
    case LoadStreamStatus::kAccountTokenFetchTimedOut:
      return out << "kAccountTokenFetchTimedOut";
    case LoadStreamStatus::kNetworkFetchTimedOut:
      return out << "kNetworkFetchTimedOut";
    case LoadStreamStatus::kLoadNotAllowedDisabled:
      return out << "kLoadNotAllowedDisabled";
    case LoadStreamStatus::kLoadNotAllowedDisabledByDse:
      return out << "kLoadNotAllowedDisabledByDse";
    case LoadStreamStatus::kNoCardReceived:
      return out << "kNoCardReceived";
  }
#else
  return out << (static_cast<int>(value));
#endif  // ifndef NDEBUG
}

bool IsLoadingSuccessfulAndFresh(LoadStreamStatus status) {
  switch (status) {
    case LoadStreamStatus::kLoadedFromStore:
    case LoadStreamStatus::kLoadedFromNetwork:
      return true;
    case LoadStreamStatus::kNoStatus:
    case LoadStreamStatus::kFailedWithStoreError:
    case LoadStreamStatus::kNoStreamDataInStore:
    case LoadStreamStatus::kModelAlreadyLoaded:
    case LoadStreamStatus::kNoResponseBody:
    case LoadStreamStatus::kProtoTranslationFailed:
    case LoadStreamStatus::kDataInStoreIsStale:
    case LoadStreamStatus::kDataInStoreIsStaleTimestampInFuture:
    case LoadStreamStatus::
        kCannotLoadFromNetworkSupressedForHistoryDelete_DEPRECATED:
    case LoadStreamStatus::kCannotLoadFromNetworkOffline:
    case LoadStreamStatus::kCannotLoadFromNetworkThrottled:
    case LoadStreamStatus::kLoadNotAllowedEulaNotAccepted:
    case LoadStreamStatus::kLoadNotAllowedArticlesListHidden:
    case LoadStreamStatus::kCannotParseNetworkResponseBody:
    case LoadStreamStatus::kLoadMoreModelIsNotLoaded:
    case LoadStreamStatus::kLoadNotAllowedDisabledByEnterprisePolicy:
    case LoadStreamStatus::kNetworkFetchFailed:
    case LoadStreamStatus::kCannotLoadMoreNoNextPageToken:
    case LoadStreamStatus::kDataInStoreStaleMissedLastRefresh:
    case LoadStreamStatus::kLoadedStaleDataFromStoreDueToNetworkFailure:
    case LoadStreamStatus::kDataInStoreIsExpired:
    case LoadStreamStatus::kDataInStoreIsForAnotherUser:
    case LoadStreamStatus::kAbortWithPendingClearAll:
    case LoadStreamStatus::kAlreadyHaveUnreadContent:
    case LoadStreamStatus::kNotAWebFeedSubscriber_DEPRECATED:

    case LoadStreamStatus::kAccountTokenFetchFailedWrongAccount:
    case LoadStreamStatus::kAccountTokenFetchTimedOut:
    case LoadStreamStatus::kNetworkFetchTimedOut:
    case LoadStreamStatus::kLoadNotAllowedDisabled:
    case LoadStreamStatus::kLoadNotAllowedDisabledByDse:
    case LoadStreamStatus::kNoCardReceived:
      return false;
  }
}

std::ostream& operator<<(std::ostream& out, UploadActionsStatus value) {
#ifndef NDEBUG
  switch (value) {
    case UploadActionsStatus::kNoStatus:
      return out << "kNoStatus";
    case UploadActionsStatus::kNoPendingActions:
      return out << "kNoPendingActions";
    case UploadActionsStatus::kFailedToStorePendingAction:
      return out << "kFailedToStorePendingAction";
    case UploadActionsStatus::kStoredPendingAction:
      return out << "kStoredPendingAction";
    case UploadActionsStatus::kUpdatedConsistencyToken:
      return out << "kUpdatedConsistencyToken";
    case UploadActionsStatus::kFinishedWithoutUpdatingConsistencyToken:
      return out << "kFinishedWithoutUpdatingConsistencyToken";
    case UploadActionsStatus::kAbortUploadForSignedOutUser:
      return out << "kAbortUploadForSignedOutUser";
    case UploadActionsStatus::kAbortUploadBecauseDisabled:
      return out << "kAbortUploadBecauseDisabled";
    case UploadActionsStatus::kAbortUploadForWrongUser:
      return out << "kAbortUploadForWrongUser";
    case UploadActionsStatus::kAbortUploadActionsWithPendingClearAll:
      return out << "kAbortUploadActionsWithPendingClearAll";
  }
#else
  return out << (static_cast<int>(value));
#endif  // ifndef NDEBUG
}

std::ostream& operator<<(std::ostream& out, UploadActionsBatchStatus value) {
#ifndef NDEBUG
  switch (value) {
    case UploadActionsBatchStatus::kNoStatus:
      return out << "kNoStatus";
    case UploadActionsBatchStatus::kFailedToUpdateStore:
      return out << "kFailedToUpdateStore";
    case UploadActionsBatchStatus::kFailedToUpload:
      return out << "kFailedToUpload";
    case UploadActionsBatchStatus::kFailedToRemoveUploadedActions:
      return out << "kFailedToRemoveUploadedActions";
    case UploadActionsBatchStatus::kExhaustedUploadQuota:
      return out << "kExhaustedUploadQuota";
    case UploadActionsBatchStatus::kAllActionsWereStale:
      return out << "kAllActionsWereStale";
    case UploadActionsBatchStatus::kSuccessfullyUploadedBatch:
      return out << "kSuccessfullyUploadedBatch";
  }
#else
  return out << (static_cast<int>(value));
#endif  // ifndef NDEBUG
}

std::string_view ToString(UserSettingsOnStart v) {
  switch (v) {
    case UserSettingsOnStart::kFeedNotEnabledByPolicy:
      return "FeedNotEnabledByPolicy";
    case UserSettingsOnStart::kFeedNotVisibleSignedOut:
      return "FeedNotVisibleSignedOut";
    case UserSettingsOnStart::kFeedNotVisibleSignedIn:
      return "FeedNotVisibleSignedIn";
    case UserSettingsOnStart::kSignedOut:
      return "SignedOut";
    case UserSettingsOnStart::kSignedInWaaOnDpOn:
      return "SignedInWaaOnDpOn";
    case UserSettingsOnStart::kSignedInWaaOnDpOff:
      return "SignedInWaaOnDpOff";
    case UserSettingsOnStart::kSignedInWaaOffDpOn:
      return "SignedInWaaOffDpOn";
    case UserSettingsOnStart::kSignedInWaaOffDpOff:
      return "SignedInWaaOffDpOff";
    case UserSettingsOnStart::kSignedInNoRecentData:
      return "SignedInNoRecentData";
    case UserSettingsOnStart::kFeedNotEnabled:
      return "FeedNotEnabled";
    case UserSettingsOnStart::kFeedNotEnabledByDse:
      return "FeedNotEnabledByDse";
  }
  return "Unknown";
}
std::ostream& operator<<(std::ostream& out, UserSettingsOnStart value) {
  return out << ToString(value);
}

}  // namespace feed
