#   Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserve.
#
# 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.

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import argparse
import distutils.util


def parse_args():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument(
        '--prepare',
        action='store_true',
        help='create the directories, prepare the vocabulary and embeddings')
    parser.add_argument('--train', action='store_true', help='train the model')
    parser.add_argument('--evaluate', action='store_true', help='evaluate the model on dev set')
    parser.add_argument('--predict', action='store_true',
                        help='predict the answers for test set with trained model')

    parser.add_argument("--embed_size", type=int, default=300,
                        help="The dimension of embedding table. (default: %(default)d)")
    parser.add_argument("--hidden_size", type=int, default=150,
                        help="The size of rnn hidden unit. (default: %(default)d)")
    parser.add_argument("--learning_rate", type=float, default=0.001,
                        help="Learning rate used to train the model. (default: %(default)f)")
    parser.add_argument('--optim', default='adam', help='optimizer type')
    parser.add_argument("--weight_decay", type=float, default=0.0001,
                        help="Weight decay. (default: %(default)f)")

    parser.add_argument('--drop_rate', type=float, default=0.0, help="Dropout probability")
    parser.add_argument('--random_seed', type=int, default=123)
    parser.add_argument("--batch_size", type=int, default=32,
                        help="The sequence number of a mini-batch data. (default: %(default)d)")
    parser.add_argument("--pass_num", type=int, default=5,
                        help="The number epochs to train. (default: %(default)d)")
    parser.add_argument("--use_gpu", type=distutils.util.strtobool, default=True,
                        help="Whether to use gpu. (default: %(default)d)")
    parser.add_argument("--log_interval", type=int, default=50,
                        help="log the train loss every n batches. (default: %(default)d)")

    parser.add_argument('--max_p_num', type=int, default=5)
    parser.add_argument('--max_a_len', type=int, default=200)
    parser.add_argument('--max_p_len', type=int, default=500)
    parser.add_argument('--max_q_len', type=int, default=60)
    parser.add_argument('--doc_num', type=int, default=5)

    parser.add_argument('--vocab_dir', default='../data/vocab', help='vocabulary')
    parser.add_argument("--save_dir", type=str, default="../data/models",
                        help="Specify the path to save trained models.")
    parser.add_argument("--save_interval", type=int, default=1,
                        help="Save the trained model every n passes. (default: %(default)d)")
    parser.add_argument("--load_dir", type=str, default="",
                        help="Specify the path to load trained models.")
    parser.add_argument('--log_path',
                        help='path of the log file. If not set, logs are printed to console')
    parser.add_argument('--result_dir', default='../data/results/',
                        help='the dir to output the results')
    parser.add_argument('--result_name', default='test_result',
                        help='the file name of the predicted results')

    parser.add_argument('--trainset', nargs='+',
                        default=['../data/demo/trainset/search.train.json'],
                        help='train dataset')
    parser.add_argument('--devset', nargs='+',
                        default=['../data/demo/devset/search.dev.json'],
                        help='dev dataset')
    parser.add_argument('--testset', nargs='+',
                        default=['../data/demo/testset/search.test.json'],
                        help='test dataset')

    parser.add_argument("--enable_ce", action='store_true',
                        help="If set, run the task with continuous evaluation logs.")
    parser.add_argument('--para_print', action='store_true', help="Print debug info")
    parser.add_argument("--dev_interval", type=int, default=-1,
                        help="evaluate on dev set loss every n batches. (default: %(default)d)")
    args = parser.parse_args()
    return args
