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

#ifndef ASH_PUBLIC_CPP_APP_LIST_APP_LIST_STRUCT_TRAITS_H_
#define ASH_PUBLIC_CPP_APP_LIST_APP_LIST_STRUCT_TRAITS_H_

#include "ash/public/cpp/app_list/app_list_types.h"
#include "ash/public/cpp/ash_public_export.h"
#include "ash/public/interfaces/app_list.mojom-shared.h"
#include "base/containers/span.h"
#include "base/strings/string16.h"
#include "mojo/public/mojom/base/string16.mojom.h"

namespace mojo {

////////////////////////////////////////////////////////////////////////////////
// AppListState:

template <>
struct EnumTraits<ash::mojom::AppListState, ash::AppListState> {
  static ash::mojom::AppListState ToMojom(ash::AppListState input) {
    switch (input) {
      case ash::AppListState::kStateApps:
        return ash::mojom::AppListState::kStateApps;
      case ash::AppListState::kStateSearchResults:
        return ash::mojom::AppListState::kStateSearchResults;
      case ash::AppListState::kStateStart:
        return ash::mojom::AppListState::kStateStart;
      case ash::AppListState::kStateEmbeddedAssistant:
        return ash::mojom::AppListState::kStateEmbeddedAssistant;
      case ash::AppListState::kInvalidState:
        break;
    }
    NOTREACHED();
    return ash::mojom::AppListState::kStateApps;
  }

  static bool FromMojom(ash::mojom::AppListState input,
                        ash::AppListState* out) {
    switch (input) {
      case ash::mojom::AppListState::kStateApps:
        *out = ash::AppListState::kStateApps;
        return true;
      case ash::mojom::AppListState::kStateSearchResults:
        *out = ash::AppListState::kStateSearchResults;
        return true;
      case ash::mojom::AppListState::kStateStart:
        *out = ash::AppListState::kStateStart;
        return true;
      case ash::mojom::AppListState::kStateEmbeddedAssistant:
        *out = ash::AppListState::kStateEmbeddedAssistant;
        return true;
    }
    NOTREACHED();
    return false;
  }
};

////////////////////////////////////////////////////////////////////////////////
// AppListModelStatus:

template <>
struct EnumTraits<ash::mojom::AppListModelStatus, ash::AppListModelStatus> {
  static ash::mojom::AppListModelStatus ToMojom(ash::AppListModelStatus input) {
    switch (input) {
      case ash::AppListModelStatus::kStatusNormal:
        return ash::mojom::AppListModelStatus::kStatusNormal;
      case ash::AppListModelStatus::kStatusSyncing:
        return ash::mojom::AppListModelStatus::kStatusSyncing;
    }
    NOTREACHED();
    return ash::mojom::AppListModelStatus::kStatusNormal;
  }

  static bool FromMojom(ash::mojom::AppListModelStatus input,
                        ash::AppListModelStatus* out) {
    switch (input) {
      case ash::mojom::AppListModelStatus::kStatusNormal:
        *out = ash::AppListModelStatus::kStatusNormal;
        return true;
      case ash::mojom::AppListModelStatus::kStatusSyncing:
        *out = ash::AppListModelStatus::kStatusSyncing;
        return true;
    }
    NOTREACHED();
    return false;
  }
};

////////////////////////////////////////////////////////////////////////////////
// SearchResultType:

template <>
struct EnumTraits<ash::mojom::SearchResultType, ash::SearchResultType> {
  static ash::mojom::SearchResultType ToMojom(ash::SearchResultType input) {
    switch (input) {
      case ash::SearchResultType::kInstalledApp:
        return ash::mojom::SearchResultType::kInstalledApp;
      case ash::SearchResultType::kPlayStoreApp:
        return ash::mojom::SearchResultType::kPlayStoreApp;
      case ash::SearchResultType::kInstantApp:
        return ash::mojom::SearchResultType::kInstantApp;
      case ash::SearchResultType::kInternalApp:
        return ash::mojom::SearchResultType::kInternalApp;
      case ash::SearchResultType::kWebStoreApp:
        return ash::mojom::SearchResultType::kWebStoreApp;
      case ash::SearchResultType::kWebStoreSearch:
        return ash::mojom::SearchResultType::kWebStoreSearch;
      case ash::SearchResultType::kOmnibox:
        return ash::mojom::SearchResultType::kOmnibox;
      case ash::SearchResultType::kLauncher:
        return ash::mojom::SearchResultType::kLauncher;
      case ash::SearchResultType::kAnswerCard:
        return ash::mojom::SearchResultType::kAnswerCard;
      case ash::SearchResultType::kPlayStoreReinstallApp:
        return ash::mojom::SearchResultType::kPlayStoreReinstallApp;
      case ash::SearchResultType::kArcAppShortcut:
        return ash::mojom::SearchResultType::kArcAppShortcut;
      case ash::SearchResultType::kUnknown:
        break;
    }
    NOTREACHED();
    return ash::mojom::SearchResultType::kInstalledApp;
  }

  static bool FromMojom(ash::mojom::SearchResultType input,
                        ash::SearchResultType* out) {
    switch (input) {
      case ash::mojom::SearchResultType::kInstalledApp:
        *out = ash::SearchResultType::kInstalledApp;
        return true;
      case ash::mojom::SearchResultType::kPlayStoreApp:
        *out = ash::SearchResultType::kPlayStoreApp;
        return true;
      case ash::mojom::SearchResultType::kInstantApp:
        *out = ash::SearchResultType::kInstantApp;
        return true;
      case ash::mojom::SearchResultType::kInternalApp:
        *out = ash::SearchResultType::kInternalApp;
        return true;
      case ash::mojom::SearchResultType::kWebStoreApp:
        *out = ash::SearchResultType::kWebStoreApp;
        return true;
      case ash::mojom::SearchResultType::kWebStoreSearch:
        *out = ash::SearchResultType::kWebStoreSearch;
        return true;
      case ash::mojom::SearchResultType::kOmnibox:
        *out = ash::SearchResultType::kOmnibox;
        return true;
      case ash::mojom::SearchResultType::kLauncher:
        *out = ash::SearchResultType::kLauncher;
        return true;
      case ash::mojom::SearchResultType::kAnswerCard:
        *out = ash::SearchResultType::kAnswerCard;
        return true;
      case ash::mojom::SearchResultType::kPlayStoreReinstallApp:
        *out = ash::SearchResultType::kPlayStoreReinstallApp;
        return true;
      case ash::mojom::SearchResultType::kArcAppShortcut:
        *out = ash::SearchResultType::kArcAppShortcut;
        return true;
    }
    NOTREACHED();
    return false;
  }
};

////////////////////////////////////////////////////////////////////////////////
// SearchResultDisplayType:

template <>
struct EnumTraits<ash::mojom::SearchResultDisplayType,
                  ash::SearchResultDisplayType> {
  static ash::mojom::SearchResultDisplayType ToMojom(
      ash::SearchResultDisplayType input) {
    switch (input) {
      case ash::SearchResultDisplayType::kNone:
        return ash::mojom::SearchResultDisplayType::kNone;
      case ash::SearchResultDisplayType::kList:
        return ash::mojom::SearchResultDisplayType::kList;
      case ash::SearchResultDisplayType::kTile:
        return ash::mojom::SearchResultDisplayType::kTile;
      case ash::SearchResultDisplayType::kRecommendation:
        return ash::mojom::SearchResultDisplayType::kRecommendation;
      case ash::SearchResultDisplayType::kCard:
        return ash::mojom::SearchResultDisplayType::kCard;
      case ash::SearchResultDisplayType::kLast:
        break;
    }
    NOTREACHED();
    return ash::mojom::SearchResultDisplayType::kNone;
  }

  static bool FromMojom(ash::mojom::SearchResultDisplayType input,
                        ash::SearchResultDisplayType* out) {
    switch (input) {
      case ash::mojom::SearchResultDisplayType::kNone:
        *out = ash::SearchResultDisplayType::kNone;
        return true;
      case ash::mojom::SearchResultDisplayType::kList:
        *out = ash::SearchResultDisplayType::kList;
        return true;
      case ash::mojom::SearchResultDisplayType::kTile:
        *out = ash::SearchResultDisplayType::kTile;
        return true;
      case ash::mojom::SearchResultDisplayType::kRecommendation:
        *out = ash::SearchResultDisplayType::kRecommendation;
        return true;
      case ash::mojom::SearchResultDisplayType::kCard:
        *out = ash::SearchResultDisplayType::kCard;
        return true;
    }
    NOTREACHED();
    return false;
  }
};

////////////////////////////////////////////////////////////////////////////////
// SearchResultTag:

template <>
struct StructTraits<ash::mojom::SearchResultTagDataView, ash::SearchResultTag> {
  static int styles(const ash::SearchResultTag& tag) { return tag.styles; }
  static const gfx::Range& range(const ash::SearchResultTag& tag) {
    return tag.range;
  }
  static bool Read(ash::mojom::SearchResultTagDataView data,
                   ash::SearchResultTag* out);
};

////////////////////////////////////////////////////////////////////////////////
// SearchResultAction:

template <>
struct StructTraits<ash::mojom::SearchResultActionDataView,
                    ash::SearchResultAction> {
  static bool Read(ash::mojom::SearchResultActionDataView data,
                   ash::SearchResultAction* out);

  static const base::string16& tooltip_text(
      const ash::SearchResultAction& action) {
    return action.tooltip_text;
  }

  static const gfx::ImageSkia& image(const ash::SearchResultAction& action) {
    return action.image;
  }

  static bool visible_on_hover(const ash::SearchResultAction& action) {
    return action.visible_on_hover;
  }
};

}  // namespace mojo

#endif  // ASH_PUBLIC_CPP_APP_LIST_APP_LIST_STRUCT_TRAITS_H_
