// 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
