/*
 * Copyright 2015 Google Inc. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <stdio.h>
#include <iostream>
#include <sstream>
#include <string>
#include "flatbuffers/hash.h"

enum OutputFormat { kDecimal, kHexadecimal, kHexadecimal0x };

int main(int argc, char *argv[]) {
  const char *name = argv[0];
  if (argc <= 1) {
    printf("%s HASH [OPTION]... STRING... [-- STRING...]\n", name);
    printf("Available hashing algorithms:\n");
    printf("  16 bit:\n");
    size_t size = sizeof(flatbuffers::kHashFunctions16) /
                  sizeof(flatbuffers::kHashFunctions16[0]);
    for (size_t i = 0; i < size; ++i) {
      printf("    * %s\n", flatbuffers::kHashFunctions16[i].name);
    }
    printf("  32 bit:\n");
    size = sizeof(flatbuffers::kHashFunctions32) /
                  sizeof(flatbuffers::kHashFunctions32[0]);
    for (size_t i = 0; i < size; ++i) {
      printf("    * %s\n", flatbuffers::kHashFunctions32[i].name);
    }
    printf("  64 bit:\n");
    size = sizeof(flatbuffers::kHashFunctions64) /
           sizeof(flatbuffers::kHashFunctions64[0]);
    for (size_t i = 0; i < size; ++i) {
      printf("    * %s\n", flatbuffers::kHashFunctions64[i].name);
    }
    printf(
        "  -d         Output hash in decimal.\n"
        "  -x         Output hash in hexadecimal.\n"
        "  -0x        Output hash in hexadecimal and prefix with 0x.\n"
        "  -c         Append the string to the output in a c-style comment.\n");
    return 0;
  }

  const char *hash_algorithm = argv[1];

  flatbuffers::NamedHashFunction<uint16_t>::HashFunction hash_function16 =
      flatbuffers::FindHashFunction16(hash_algorithm);
  flatbuffers::NamedHashFunction<uint32_t>::HashFunction hash_function32 =
      flatbuffers::FindHashFunction32(hash_algorithm);
  flatbuffers::NamedHashFunction<uint64_t>::HashFunction hash_function64 =
      flatbuffers::FindHashFunction64(hash_algorithm);

  if (!hash_function16 && !hash_function32 && !hash_function64) {
    printf("\"%s\" is not a known hash algorithm.\n", hash_algorithm);
    return 0;
  }

  OutputFormat output_format = kHexadecimal;
  bool annotate = false;
  bool escape_dash = false;
  for (int i = 2; i < argc; i++) {
    const char *arg = argv[i];
    if (!escape_dash && arg[0] == '-') {
      std::string opt = arg;
      if (opt == "-d")
        output_format = kDecimal;
      else if (opt == "-x")
        output_format = kHexadecimal;
      else if (opt == "-0x")
        output_format = kHexadecimal0x;
      else if (opt == "-c")
        annotate = true;
      else if (opt == "--")
        escape_dash = true;
      else
        printf("Unrecognized argument: \"%s\"\n", arg);
    } else {
      std::stringstream ss;
      if (output_format == kDecimal) {
        ss << std::dec;
      } else if (output_format == kHexadecimal) {
        ss << std::hex;
      } else if (output_format == kHexadecimal0x) {
        ss << std::hex;
        ss << "0x";
      }
      if (hash_function16)
        ss << hash_function16(arg);
      else if (hash_function32)
        ss << hash_function32(arg);
      else if (hash_function64)
        ss << hash_function64(arg);

      if (annotate) ss << " /* \"" << arg << "\" */";

      ss << "\n";

      std::cout << ss.str();
    }
  }
  return 0;
}
