#include <climits>
#include <cstddef>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <glob.h>
#include <vector>

#include "./deorummolae.h"
#include "./durchschlag.h"
#include "./sieve.h"

/* This isn't a definitive list of "--foo" arguments, only those that take an
 * additional "=#" integer parameter, like "--foo=20" or "--foo=32K".
 */
#define LONG_ARG_BLOCK_LEN "--block_len="
#define LONG_ARG_SLICE_LEN "--slice_len="
#define LONG_ARG_TARGET_DICT_LEN "--target_dict_len="
#define LONG_ARG_MIN_SLICE_POP "--min_slice_pop="
#define LONG_ARG_CHUNK_LEN "--chunk_len="
#define LONG_ARG_OVERLAP_LEN "--overlap_len="

#define METHOD_DM 0
#define METHOD_SIEVE 1
#define METHOD_DURCHSCHLAG 2
#define METHOD_DISTILL 3
#define METHOD_PURIFY 4

static size_t readInt(const char* str) {
  size_t result = 0;
  if (str[0] == 0 || str[0] == '0') {
    return 0;
  }
  for (size_t i = 0; i < 13; ++i) {
    if (str[i] == 0) {
      return result;
    }
    if (str[i] == 'k' || str[i] == 'K') {
      if ((str[i + 1] == 0) && ((result << 10) > result)) {
        return result << 10;
      }
      return 0;
    }
    if (str[i] == 'm' || str[i] == 'M') {
      if ((str[i + 1] == 0) && ((result << 20) > result)) {
        return result << 20;
      }
      return 0;
    }
    if (str[i] < '0' || str[i] > '9') {
      return 0;
    }
    size_t next = (10 * result) + (str[i] - '0');
    if (next <= result) {
      return 0;
    }
    result = next;
  }
  return 0;
}

static std::string readFile(const std::string& path) {
  std::ifstream file(path);
  std::string content(
      (std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
  return content;
}

static void writeFile(const char* file, const std::string& content) {
  std::ofstream outfile(file, std::ofstream::binary);
  outfile.write(content.c_str(), static_cast<std::streamsize>(content.size()));
  outfile.close();
}

static void writeSamples(const std::vector<std::string>& paths,
    const std::vector<size_t>& sizes, const uint8_t* data) {
  size_t offset = 0;
  for (size_t i = 0; i < paths.size(); ++i) {
    const char* path = paths[i].c_str();
    size_t sampleSize = sizes[i];
    std::ofstream outfile(path, std::ofstream::binary);
    outfile.write(reinterpret_cast<const char*>(data + offset),
        static_cast<std::streamsize>(sampleSize));
    outfile.close();
    offset += sampleSize;
  }
}

/* Returns "base file name" or its tail, if it contains '/' or '\'. */
static const char* fileName(const char* path) {
  const char* separator_position = strrchr(path, '/');
  if (separator_position) path = separator_position + 1;
  separator_position = strrchr(path, '\\');
  if (separator_position) path = separator_position + 1;
  return path;
}

static void printHelp(const char* name) {
  fprintf(stderr, "Usage: %s [OPTION]... DICTIONARY [SAMPLE]...\n", name);
  fprintf(stderr,
      "Options:\n"
      "  --dm       use 'deorummolae' engine\n"
      "  --distill  rewrite samples; unique text parts are removed\n"
      "  --dsh      use 'durchschlag' engine (default)\n"
      "  --purify   rewrite samples; unique text parts are zeroed out\n"
      "  --sieve    use 'sieve' engine\n"
      "  -b#, --block_len=#\n"
      "             set block length for 'durchschlag'; default: 1024\n"
      "  -s#, --slice_len=#\n"
      "             set slice length for 'distill', 'durchschlag', 'purify'\n"
      "             and 'sieve'; default: 16\n"
      "  -t#, --target_dict_len=#\n"
      "             set target dictionary length (limit); default: 16K\n"
      "  -u#, --min_slice_pop=#\n"
      "             set minimum slice population (for rewrites); default: 2\n"
      "  -c#, --chunk_len=#\n"
      "             if positive, samples are cut into chunks of this length;\n"
      "             default: 0; cannot mix with 'rewrite samples'\n"
      "  -o#, --overlap_len=#\n"
      "             set chunk overlap length; default 0\n"
      "# is a decimal number with optional k/K/m/M suffix.\n"
      "WARNING: 'distill' and 'purify' will overwrite original samples!\n"
      "         Completely unique samples might become empty files.\n\n");
}

int main(int argc, char const* argv[]) {
  int dictionaryArg = -1;
  int method = METHOD_DURCHSCHLAG;
  size_t sliceLen = 16;
  size_t targetSize = 16 << 10;
  size_t blockSize = 1024;
  size_t minimumPopulation = 2;
  size_t chunkLen = 0;
  size_t overlapLen = 0;

  std::vector<uint8_t> data;
  std::vector<size_t> sizes;
  std::vector<std::string> paths;
  size_t total = 0;
  for (int i = 1; i < argc; ++i) {
    if (argv[i] == nullptr) {
      continue;
    }

    if (argv[i][0] == '-') {
      char arg1 = argv[i][1];
      const char* arg2 = arg1 ? &argv[i][2] : nullptr;
      if (arg1 == '-') {
        if (dictionaryArg != -1) {
          fprintf(stderr,
              "Method should be specified before dictionary / sample '%s'\n",
              argv[i]);
          exit(1);
        }

        /* Look for "--long_arg" via exact match. */
        if (std::strcmp(argv[i], "--sieve") == 0) {
          method = METHOD_SIEVE;
          continue;
        }
        if (std::strcmp(argv[i], "--dm") == 0) {
          method = METHOD_DM;
          continue;
        }
        if (std::strcmp(argv[i], "--dsh") == 0) {
          method = METHOD_DURCHSCHLAG;
          continue;
        }
        if (std::strcmp(argv[i], "--distill") == 0) {
          method = METHOD_DISTILL;
          continue;
        }
        if (std::strcmp(argv[i], "--purify") == 0) {
          method = METHOD_PURIFY;
          continue;
        }

        /* Look for "--long_arg=#" via prefix match. */
        if (std::strncmp(argv[i], LONG_ARG_BLOCK_LEN,
              std::strlen(LONG_ARG_BLOCK_LEN)) == 0) {
          arg1 = 'b';
          arg2 = &argv[i][std::strlen(LONG_ARG_BLOCK_LEN)];
        } else if (std::strncmp(argv[i], LONG_ARG_SLICE_LEN,
              std::strlen(LONG_ARG_SLICE_LEN)) == 0) {
          arg1 = 's';
          arg2 = &argv[i][std::strlen(LONG_ARG_SLICE_LEN)];
        } else if (std::strncmp(argv[i], LONG_ARG_TARGET_DICT_LEN,
              std::strlen(LONG_ARG_TARGET_DICT_LEN)) == 0) {
          arg1 = 't';
          arg2 = &argv[i][std::strlen(LONG_ARG_TARGET_DICT_LEN)];
        } else if (std::strncmp(argv[i], LONG_ARG_MIN_SLICE_POP,
              std::strlen(LONG_ARG_MIN_SLICE_POP)) == 0) {
          arg1 = 'u';
          arg2 = &argv[i][std::strlen(LONG_ARG_MIN_SLICE_POP)];
        } else if (std::strncmp(argv[i], LONG_ARG_CHUNK_LEN,
              std::strlen(LONG_ARG_CHUNK_LEN)) == 0) {
          arg1 = 'c';
          arg2 = &argv[i][std::strlen(LONG_ARG_CHUNK_LEN)];
        } else if (std::strncmp(argv[i], LONG_ARG_OVERLAP_LEN,
              std::strlen(LONG_ARG_OVERLAP_LEN)) == 0) {
          arg1 = 'o';
          arg2 = &argv[i][std::strlen(LONG_ARG_OVERLAP_LEN)];
        } else {
          printHelp(fileName(argv[0]));
          fprintf(stderr, "Invalid option '%s'\n", argv[i]);
          exit(1);
        }
      }

      /* Look for "-f" short args or "--foo=#" long args. */
      if (arg1 == 'b') {
        blockSize = readInt(arg2);
        if (blockSize < 16 || blockSize > 65536) {
          printHelp(fileName(argv[0]));
          fprintf(stderr, "Invalid option '%s'\n", argv[i]);
          exit(1);
        }
      } else if (arg1 == 's') {
        sliceLen = readInt(arg2);
        // TODO: investigate why sliceLen == 4..5 greatly slows down
        //               durschlag engine, but only from command line;
        //               durschlag_runner seems to work fine with those.
        if (sliceLen < 4 || sliceLen > 256) {
          printHelp(fileName(argv[0]));
          fprintf(stderr, "Invalid option '%s'\n", argv[i]);
          exit(1);
        }
      } else if (arg1 == 't') {
        targetSize = readInt(arg2);
        if (targetSize < 256 || targetSize > (1 << 25)) {
          printHelp(fileName(argv[0]));
          fprintf(stderr, "Invalid option '%s'\n", argv[i]);
          exit(1);
        }
      } else if (arg1 == 'u') {
        minimumPopulation = readInt(arg2);
        if (minimumPopulation < 256 || minimumPopulation > 65536) {
          printHelp(fileName(argv[0]));
          fprintf(stderr, "Invalid option '%s'\n", argv[i]);
          exit(1);
        }
      } else if (arg1 == 'c') {
        chunkLen = readInt(arg2);
        if (chunkLen < 0 || chunkLen > INT_MAX) {
          printHelp(fileName(argv[0]));
          fprintf(stderr, "Invalid option '%s'\n", argv[i]);
          exit(1);
        }
      } else if (arg1 == 'o') {
        overlapLen = readInt(arg2);
        if (overlapLen < 0 || overlapLen > INT_MAX) {
          printHelp(fileName(argv[0]));
          fprintf(stderr, "Invalid option '%s'\n", argv[i]);
          exit(1);
        }
      } else {
        printHelp(fileName(argv[0]));
        fprintf(stderr, "Unrecognized option '%s'\n", argv[i]);
        exit(1);
      }
      continue;
    }

    if (dictionaryArg == -1) {
      if (method != METHOD_DISTILL && method != METHOD_PURIFY) {
        dictionaryArg = i;
        continue;
      }
    }

    glob_t resolved_paths;
    memset(&resolved_paths, 0, sizeof(resolved_paths));
    bool ok = true;
    if (glob(argv[i], GLOB_TILDE, NULL, &resolved_paths) == 0) {
      for(size_t j = 0; j < resolved_paths.gl_pathc; ++j) {
        std::string content = readFile(resolved_paths.gl_pathv[j]);
        if (chunkLen == 0) {
          paths.emplace_back(resolved_paths.gl_pathv[j]);
          data.insert(data.end(), content.begin(), content.end());
          total += content.size();
          sizes.push_back(content.size());
          continue;
        } else if (chunkLen <= overlapLen) {
          printHelp(fileName(argv[0]));
          fprintf(stderr, "Invalid chunkLen - overlapLen combination\n");
          exit(1);
        }
        for (size_t chunkStart = 0;
            chunkStart < content.size();
            chunkStart += chunkLen - overlapLen) {
          std::string chunk = content.substr(chunkStart, chunkLen);
          data.insert(data.end(), chunk.begin(), chunk.end());
          total += chunk.size();
          sizes.push_back(chunk.size());
        }
      }
    } else {
      ok = false;
    }
    globfree(&resolved_paths);
    if (!ok) exit(1);
  }

  fprintf(stderr, "Number of chunks: %zu; total size: %zu\n", sizes.size(),
          total);

  bool wantDictionary = (dictionaryArg == -1);
  if (method == METHOD_DISTILL || method == METHOD_PURIFY) {
    wantDictionary = false;
    if (chunkLen != 0) {
      printHelp(fileName(argv[0]));
      fprintf(stderr, "Cannot mix 'rewrite samples' with positive chunk_len\n");
      exit(1);
    }
  }
  if (wantDictionary || total == 0) {
    printHelp(fileName(argv[0]));
    fprintf(stderr, "Not enough arguments\n");
    exit(1);
  }

  if (method == METHOD_SIEVE) {
    writeFile(argv[dictionaryArg], sieve_generate(
        targetSize, sliceLen, sizes, data.data()));
  } else if (method == METHOD_DM) {
    writeFile(argv[dictionaryArg], DM_generate(
        targetSize, sizes, data.data()));
  } else if (method == METHOD_DURCHSCHLAG) {
    writeFile(argv[dictionaryArg], durchschlag_generate(
        targetSize, sliceLen, blockSize, sizes, data.data()));
  } else if (method == METHOD_DISTILL) {
    durchschlag_distill(sliceLen, minimumPopulation, &sizes, data.data());
    writeSamples(paths, sizes, data.data());
  } else if (method == METHOD_PURIFY) {
    durchschlag_purify(sliceLen, minimumPopulation, sizes, data.data());
    writeSamples(paths, sizes, data.data());
  } else {
    printHelp(fileName(argv[0]));
    fprintf(stderr, "Unknown generator\n");
    exit(1);
  }
  return 0;
}
