#!/bin/bash

# 参考:https://programwiz.org/2022/03/22/how-to-write-shell-script-for-option-parsing/

set -eu

echo "------"
echo "$@"
echo "------"

usage() {
    echo "
usage: 
    For training
        $0 [-t] [-b batch_size] [-r] 
            -t: flag for training mode
            -b: batch_size.
            -r: flag for resuming training.
    For changing voice
        $0 [-v] [-c config] [-m model]
            -v: flag for voice change mode
            -c: config
            -m: model name
    For help
        $0 [-h]
            -h: show this help
" >&2
}
warn () {
    echo "! ! ! $1 ! ! !"
    exit 1
}


training_flag=false
batch_size=10
resume_flag=false

voice_change_flag=false
config=
model=

escape_flag=false

# オプション解析
while getopts tb:rvc:m:hx OPT; do
    case $OPT in
    t) 
        training_flag=true
        ;;
    b) 
        batch_size="$OPTARG"
        ;;
    r) 
        resume_flag=true
        ;;
    v) 
        voice_change_flag=true
        ;;
    c) 
        config="$OPTARG"
        ;;
    m) 
        model="$OPTARG"
        ;;
    h | \?) 
        usage && exit 1
        ;;
    x)
        escape_flag=true
    esac
done



# ## コマンドライン引数から、オプション引数分を削除
# # shift $((OPTIND - 1))

# # モード解析
# if $training_flag && $voice_change_flag; then
#     warn "-t(トレーニングモード) と -v(ボイチェンモード)は同時に指定できません。"
#     exit 1
# elif $training_flag; then
#     echo "■■■  ト レ ー ニ ン グ モ ー ド   ■■■"
# elif $voice_change_flag; then
#     echo "■■■  ボ イ チ ェ ン モ ー ド  ■■■"
# elif $escape_flag; then
#     /bin/bash
# else
#     warn "-t(トレーニングモード) と -v(ボイチェンモード)のいずれかを指定してください。"
#     exit 1
# fi



if $training_flag; then


    python3 create_dataset_jtalk.py -f train_config -s 24000 -m dataset/multi_speaker_correspondence.txt
    # date_tag=`date +%Y%m%d%H%M%S`
    sed -ie 's/80000/8000/' train_ms.py
    sed -ie "s/\"batch_size\": 10/\"batch_size\": $batch_size/" configs/train_config.json
    sed -ie "s/torch.cuda.device_count()/1/" train_ms.py
    python3 -m tensorboard.main --logdir logs --port 6006 --host 0.0.0.0 &

    if ${resume_flag}; then
        echo "トレーニング再開。バッチサイズ: ${batch_size}。"
        python3 train_ms.py -c configs/train_config.json -m vc
    else
        echo "トレーニング開始。バッチサイズ: ${batch_size}。"
        python3 train_ms.py -c configs/train_config.json -m vc -fg fine_model/G_180000.pth -fd fine_model/D_180000.pth
    fi
fi

if $voice_change_flag; then
    if [[ -z "$config" ]]; then
        warn "コンフィグファイル(-c)を指定してください"
    fi
    if [[ -z "$model" ]]; then
        warn "モデルファイル(-m)を指定してください"
    fi

    cd /voice-changer-internal/voice-change-service

    cp -r /resources/* .
    if [[ -e ./setting.json ]]; then
        cp ./setting.json ../frontend/dist/assets/setting.json
    fi
    echo "-----------!!"
    echo $config $model
    echo $model
    python3 serverSIO.py -p 8080 -c $config -m $model --https True --httpsSelfSigned True
fi