// Copyright 2016 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/lib/firebase/encoding.h"

#include <src/lib/fxl/strings/utf_codecs.h>

#include "peridot/lib/base64url/base64url.h"

namespace firebase {

namespace {

// Returns true iff the given value can be put in Firebase without encoding.
// Firebase requires the values to be valid UTF-8 JSON strings. JSON disallows
// control characters in strings. We disallow backslash and double quote to
// avoid reasoning about escaping. Note: this is a stop-gap solution, see
// LE-118.
bool CanValueBeVerbatim(fxl::StringView bytes) {
  // Once encryption is in place this won't be useful. Until then, storing valid
  // utf8 strings verbatim simplifies debugging.
  if (!fxl::IsStringUTF8(bytes)) {
    return false;
  }

  for (const char& byte : bytes) {
    if (static_cast<unsigned char>(byte) <= 31 || byte == 127 || byte == '\"' ||
        byte == '\\') {
      return false;
    }
  }

  return true;
}

// Characters that are not allowed to appear in a Firebase key (but may appear
// in a value). See
// https://firebase.google.com/docs/database/rest/structure-data.
const char kIllegalKeyChars[] = ".$#[]/+";

// Encodes the given bytes for storage in Firebase. We use the same encoding
// function for both values and keys for simplicity, yielding values that can be
// always safely used as either. Note: this is a stop-gap solution, see LE-118.
std::string Encode(fxl::StringView s, bool verbatim) {
  if (verbatim) {
    return s.ToString() + "V";
  }

  std::string encoded;
  return base64url::Base64UrlEncode(s) + "B";
}

}  // namespace

// Returns true if the given value can be used as a Firebase key without
// encoding.
bool CanKeyBeVerbatim(fxl::StringView bytes) {
  if (!CanValueBeVerbatim(bytes)) {
    return false;
  }

  if (bytes.find_first_of(std::string(kIllegalKeyChars)) != std::string::npos) {
    return false;
  }

  return true;
}

std::string EncodeKey(convert::ExtendedStringView bytes) {
  return Encode(bytes, CanKeyBeVerbatim(bytes));
}

std::string EncodeValue(convert::ExtendedStringView bytes) {
  return Encode(bytes, CanValueBeVerbatim(bytes));
}

bool Decode(convert::ExtendedStringView input, std::string* output) {
  if (input.empty()) {
    return false;
  }

  fxl::StringView data = input.substr(0, input.size() - 1);

  if (input.back() == 'V') {
    *output = data.ToString();
    return true;
  }

  if (input.back() == 'B') {
    return base64url::Base64UrlDecode(data, output);
  }

  return false;
}

}  // namespace firebase
