/*
 * Open Chinese Convert
 *
 * Copyright 2010-2026 Carbo Kuo and contributors
 *
 * 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 "src/DictConverter.hpp"
#include "src/CmdLineOutput.hpp"
#include "src/Exception.hpp"

using namespace opencc;

int main(int argc, const char* argv[]) {
  try {
    TCLAP::CmdLine cmd("Open Chinese Convert (OpenCC) Dictionary Tool", ' ',
                       OPENCC_VERSION);
    CmdLineOutput cmdLineOutput;
    cmd.setOutput(&cmdLineOutput);

    std::vector<std::string> inputFormats{"text", "text_space", "ocd2", "ocd",
                                          "cppjieba_utf8"};
    TCLAP::ValuesConstraint<std::string> allowedInputVals(inputFormats);
    std::vector<std::string> outputFormats{"text", "ocd2", "ocd"};
    TCLAP::ValuesConstraint<std::string> allowedOutputVals(outputFormats);

    TCLAP::ValueArg<std::string> toArg("t", "to", "Output format",
                                       true /* required */, "" /* default */,
                                       &allowedOutputVals /* type */, cmd);
    TCLAP::ValueArg<std::string> fromArg("f", "from", "Input format",
                                         true /* required */, "" /* default */,
                                         &allowedInputVals /* type */, cmd);
    TCLAP::ValueArg<std::string> outputArg(
        "o", "output", "Path to output dictionary", true /* required */,
        "" /* default */, "file" /* type */, cmd);
    TCLAP::MultiArg<std::string> inputArg(
        "i", "input", "Path to input dictionary", true /* required */,
        "file" /* type */, cmd);
    cmd.parse(argc, argv);
    ConvertDictionary(inputArg.getValue(), outputArg.getValue(),
                      fromArg.getValue(), toArg.getValue());
  } catch (TCLAP::ArgException& e) {
    std::cerr << "error: " << e.error() << " for arg " << e.argId()
              << std::endl;
    return 1;
  } catch (Exception& e) {
    std::cerr << e.what() << std::endl;
    return 1;
  }
  return 0;
}
