// Copyright 2018 The Fuchsia 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 "peridot/bin/sessionmgr/storage/story_storage_xdr.h"
#include "peridot/lib/module_manifest/module_manifest_xdr.h"

#include <lib/fidl/cpp/clone.h>
#include <lib/fsl/vmo/strings.h>

namespace modular {

void XdrLinkPath(XdrContext* const xdr,
                 fuchsia::modular::LinkPath* const data) {
  xdr->Field("module_path", &data->module_path);
  xdr->Field("link_name", &data->link_name);
}

void XdrModuleParameterMapEntry(
    XdrContext* const xdr,
    fuchsia::modular::ModuleParameterMapEntry* const data) {
  // NOTE: the JSON field naming doesn't match the FIDL struct naming because
  // the field names in FIDL were changed.
  xdr->Field("key", &data->name);
  xdr->Field("link_path", &data->link_path, XdrLinkPath);
}

void XdrModuleParameterMap(XdrContext* const xdr,
                           fuchsia::modular::ModuleParameterMap* const data) {
  // NOTE: the JSON field naming doesn't match the FIDL struct naming because
  // the field names in FIDL were changed.
  xdr->Field("key_to_link_map", &data->entries, XdrModuleParameterMapEntry);
}

void XdrSurfaceRelation(XdrContext* const xdr,
                        fuchsia::modular::SurfaceRelation* const data) {
  xdr->Field("arrangement", &data->arrangement);
  xdr->Field("dependency", &data->dependency);
  xdr->Field("emphasis", &data->emphasis);
}

void XdrIntentParameterData(XdrContext* const xdr,
                            fuchsia::modular::IntentParameterData* const data) {
  static constexpr char kTag[] = "tag";
  static constexpr char kEntityReference[] = "entity_reference";
  static constexpr char kJson[] = "json";
  static constexpr char kEntityType[] = "entity_type";
  static constexpr char kLinkName[] = "link_name";
  static constexpr char kLinkPath[] = "link_path";

  switch (xdr->op()) {
    case XdrOp::FROM_JSON: {
      std::string tag;
      xdr->Field(kTag, &tag);

      if (tag == kEntityReference) {
        fidl::StringPtr value;
        xdr->Field(kEntityReference, &value);
        data->set_entity_reference(std::move(value));
      } else if (tag == kJson) {
        fidl::StringPtr value;
        xdr->Field(kJson, &value);
        fsl::SizedVmo vmo;
        FXL_CHECK(fsl::VmoFromString(*value, &vmo));
        data->set_json(std::move(vmo).ToTransport());
      } else if (tag == kEntityType) {
        ::fidl::VectorPtr<::fidl::StringPtr> value;
        xdr->Field(kEntityType, &value);
        data->set_entity_type(std::move(value));
      } else if (tag == kLinkName) {
        fidl::StringPtr value;
        xdr->Field(kLinkName, &value);
        data->set_link_name(std::move(value));
      } else if (tag == kLinkPath) {
        fuchsia::modular::LinkPath value;
        xdr->Field(kLinkPath, &value, XdrLinkPath);
        data->set_link_path(std::move(value));
      } else {
        FXL_LOG(ERROR) << "XdrIntentParameterData FROM_JSON unknown tag: "
                       << tag;
      }
      break;
    }

    case XdrOp::TO_JSON: {
      std::string tag;

      switch (data->Which()) {
        case fuchsia::modular::IntentParameterData::Tag::kEntityReference: {
          tag = kEntityReference;
          fidl::StringPtr value = data->entity_reference();
          xdr->Field(kEntityReference, &value);
          break;
        }
        case fuchsia::modular::IntentParameterData::Tag::kJson: {
          tag = kJson;
          std::string json_string;
          FXL_CHECK(fsl::StringFromVmo(data->json(), &json_string));
          fidl::StringPtr value = json_string;
          xdr->Field(kJson, &value);
          break;
        }
        case fuchsia::modular::IntentParameterData::Tag::kEntityType: {
          tag = kEntityType;
          fidl::VectorPtr<fidl::StringPtr> value = Clone(data->entity_type());
          xdr->Field(kEntityType, &value);
          break;
        }
        case fuchsia::modular::IntentParameterData::Tag::kLinkName: {
          tag = kLinkName;
          fidl::StringPtr value = data->link_name();
          xdr->Field(kLinkName, &value);
          break;
        }
        case fuchsia::modular::IntentParameterData::Tag::kLinkPath: {
          tag = kLinkPath;
          xdr->Field(kLinkPath, &data->link_path(), XdrLinkPath);
          break;
        }
        case fuchsia::modular::IntentParameterData::Tag::Invalid:
          FXL_LOG(ERROR) << "XdrIntentParameterData TO_JSON unknown tag: "
                         << static_cast<int>(data->Which());
          break;
      }

      xdr->Field(kTag, &tag);
      break;
    }
  }
}

void XdrIntentParameter(XdrContext* const xdr,
                        fuchsia::modular::IntentParameter* const data) {
  xdr->Field("name", &data->name);
  xdr->Field("data", &data->data, XdrIntentParameterData);
}

void XdrIntent(XdrContext* const xdr, fuchsia::modular::Intent* const data) {
  xdr->Field("action_name", &data->action);
  xdr->Field("action_handler", &data->handler);
  xdr->Field("parameters", &data->parameters, XdrIntentParameter);
}

void XdrModuleData_v1(XdrContext* const xdr,
                      fuchsia::modular::ModuleData* const data) {
  xdr->Field("url", &data->module_url);
  xdr->Field("module_path", &data->module_path);
  xdr->Field("module_source", &data->module_source);
  xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
  xdr->Field("module_stopped", &data->module_deleted);
  xdr->Field("intent", &data->intent, XdrIntent);

  // In previous versions we did not have these fields.
  data->parameter_map.entries.resize(0);
  data->module_manifest.reset();
}

void XdrModuleData_v2(XdrContext* const xdr,
                      fuchsia::modular::ModuleData* const data) {
  xdr->Field("url", &data->module_url);
  xdr->Field("module_path", &data->module_path);
  xdr->Field("module_source", &data->module_source);
  xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
  xdr->Field("module_stopped", &data->module_deleted);
  xdr->Field("intent", &data->intent, XdrIntent);
  // NOTE: the JSON field naming doesn't match the FIDL struct naming because
  // the field name in FIDL was changed.
  xdr->Field("chain_data", &data->parameter_map, XdrModuleParameterMap);

  // In previous versions we did not have these fields.
  data->module_manifest.reset();
}

void XdrModuleData_v3(XdrContext* const xdr,
                      fuchsia::modular::ModuleData* const data) {
  xdr->Field("url", &data->module_url);
  xdr->Field("module_path", &data->module_path);
  xdr->Field("module_source", &data->module_source);
  xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
  xdr->Field("module_stopped", &data->module_deleted);
  xdr->Field("intent", &data->intent, XdrIntent);
  // NOTE: the JSON field naming doesn't match the FIDL struct naming because
  // the field name in FIDL was changed.
  xdr->Field("chain_data", &data->parameter_map, XdrModuleParameterMap);
  xdr->Field("module_manifest", &data->module_manifest, XdrModuleManifest_v1);
}

void XdrModuleData_v4(XdrContext* const xdr,
                      fuchsia::modular::ModuleData* const data) {
  if (!xdr->Version(4)) {
    return;
  }
  xdr->Field("url", &data->module_url);
  xdr->Field("module_path", &data->module_path);
  xdr->Field("module_source", &data->module_source);
  xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
  xdr->Field("module_stopped", &data->module_deleted);
  xdr->Field("intent", &data->intent, XdrIntent);
  // NOTE: the JSON field naming doesn't match the FIDL struct naming because
  // the field name in FIDL was changed.
  xdr->Field("chain_data", &data->parameter_map, XdrModuleParameterMap);
  xdr->Field("module_manifest", &data->module_manifest, XdrModuleManifest_v2);
}

void XdrModuleData_v5(XdrContext* const xdr,
                      fuchsia::modular::ModuleData* const data) {
  if (!xdr->Version(5)) {
    return;
  }
  xdr->Field("url", &data->module_url);
  xdr->Field("module_path", &data->module_path);
  xdr->Field("module_source", &data->module_source);
  xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
  xdr->Field("module_deleted", &data->module_deleted);
  xdr->Field("intent", &data->intent, XdrIntent);
  // NOTE: the JSON field naming doesn't match the FIDL struct naming because
  // the field name in FIDL was changed.
  xdr->Field("chain_data", &data->parameter_map, XdrModuleParameterMap);
  xdr->Field("module_manifest", &data->module_manifest, XdrModuleManifest_v2);
}

XdrFilterType<fuchsia::modular::ModuleData> XdrModuleData[] = {
    XdrModuleData_v5, XdrModuleData_v4, XdrModuleData_v3,
    XdrModuleData_v2, XdrModuleData_v1, nullptr,
};

}  // namespace modular
