#!/usr/bin/env bash

FLAGL=0
FLAGD=0
JUSER=0

function processDate {
    DATEFMT="$2"
    case $(uname) in
        Linux)
            Y=$(echo $1 | cut -d "." -f3)
            M=$(echo $1 | cut -d "." -f2)
            D=$(echo $1 | cut -d "." -f1)
            DATECMD="date -d $Y-$M-$D"
            ;;
        FreeBSD|Darwin)
            DATECMD="date -j -f %d.%m.%Y $1"
            ;;
    esac
    echo $($DATECMD +$2)
}

while getopts "ldu:" flag
do
    case $flag in
        l) FLAGL=1;;
        d) FLAGD=1;;
        u) JUSER="$OPTARG";;
    esac
done

if [[ $FLAGL == 1 || $FLAGD == 1 ]]; then shift 1; fi
if [[ $JUSER != 0 ]]; then shift 2; fi

if [[ $# != 5 ]]; then
    echo "Неверные аргументы
Использование: changeloger версия начальная_дата конечная_дата предыдущая_ревизия текущая_ревизия
                   скачивает файлы из JIRA, спросит пароль для входа в JIRA, имя JIRA-пользователя при этом равно результату выполнения whoami
               changeloger -l версия начальная_дата конечная_дата предыдущая_ревизия текущая_ревизия
                   ищет файлы в рабочей директории
               changeloger -d версия начальная_дата конечная_дата предыдущая_ревизия текущая_ревизия
                   скачивает файлы из JIRA, спросит пароль для входа в JIRA, разрешает разницу дат > 30 дней, имя JIRA-пользователя при этом равно результату выполнения whoami
               changeloger -ld версия начальная_дата конечная_дата предыдущая_ревизия текущая_ревизия
                   ищет файлы в рабочей директории, разрешает разницу дат > 30 дней
               changeloger [-d] -u user версия начальная_дата конечная_дата предыдущая_ревизия текущая_ревизия
                   скачивает файлы из JIRA, спросит пароль для входа в JIRA, разрешает разницу дат > 30 дней, имя JIRA-пользователя равно user
Расшифровка имён файлов:
               new.xml           - Новое
               view-big.xml      - Крупные визуальные изменения
               view-small.xml    - Мелкие визуальные изменения
               code-big.xml      - Крупные изменения в коде
               code-small.xml    - Мелкие изменения в коде
               site.xml          - Сайт
Имена файлов фиксированы: changeloger ищет (или при скачивании из JIRA пишет в) файлы с указанными выше именами.
Формат даты фиксирован: [d]d.[m]m.yyyy." >&2
else
    ARGSARR=($*)
    VERSION=${ARGSARR[0]}
    SDATE=$(processDate "${ARGSARR[1]}" "%d.%m.%Y")
    EDATE=$(processDate "${ARGSARR[2]}" "%d.%m.%Y")
    PREV=${ARGSARR[3]}
    CREV=${ARGSARR[4]}

    CLOUTTMP=.changelog.tmp
    if [[ $FLAGD == 0 ]]; then
        SDATES=$(processDate "$SDATE" "%s")
        EDATES=$(processDate "$EDATE" "%s")
        DAYS=$(( ($EDATES-$SDATES) / 60 / 60 / 24 ))

        if [[ $DAYS -gt 30 ]]; then
            echo "Слишком большой временной промежуток (дней: $DAYS), укажите при запуске ключ -d" >&2
            exit 1
        fi
    fi

    SJDATE="%27${SDATE:6:4}-${SDATE:3:2}-${SDATE:0:2}+23%3A59%27"
    EJDATE="%27${EDATE:6:4}-${EDATE:3:2}-${EDATE:0:2}+23%3A59%27"

    VARR=($(echo $VERSION | tr "." " "))
    SHORTVERSION="${VARR[0]}.${VARR[1]}"

    FILTER_V_EXCLUDE=""
    if [[ ${VARR[2]} == "0" ]]; then
        for ((i=3; i<${VARR[1]}; i++)); do
            FILTER_V_EXCLUDE="${FILTER_V_EXCLUDE}fixVersion+%21%3D+%222.$i%22+AND+"
        done
    fi

    FILTERT=("Новое" "Крупные визуальные изменения" "Мелкие визуальные изменения" "Крупные изменения в коде" "Мелкие изменения в коде" "Сайт")

    FILTERQ_PRE="https://jira.yandex-team.ru/sr/jira.issueviews:searchrequest-printable/temp/SearchRequest.html?jqlQuery=project+%3D+LEGO+AND+resolution+%3D+Fixed+AND+status+in+%28Resolved%2C+Closed%29+AND+resolved+%3E+${SJDATE}+AND+resolved+%3C%3D+${EJDATE}+AND+fixVersion+%3D+%22${SHORTVERSION}%22+AND+${FILTER_V_EXCLUDE}component+%3D+%22Changelog%3A+"
    FILTERQ_POST="&amp;tempMax=500"
    FILTERQ=("${FILTERQ_PRE}%D0%9D%D0%BE%D0%B2%D0%BE%D0%B5%22+ORDER+BY+summary%2C+priority%2C+createdDate+ASC${FILTERQ_POST}"
             "${FILTERQ_PRE}%D0%92%D0%B8%D0%B4%3A+%D0%BA%D1%80%D1%83%D0%BF%D0%BD%D0%BE%D0%B5%22+ORDER+BY+summary%2C+priority%2C+createdDate+ASC${FILTERQ_POST}"
             "${FILTERQ_PRE}%D0%92%D0%B8%D0%B4%3A+%D0%BC%D0%B5%D0%BB%D0%BA%D0%BE%D0%B5%22+ORDER+BY+summary%2C+priority%2C+createdDate+ASC${FILTERQ_POST}"
             "${FILTERQ_PRE}%D0%9A%D0%BE%D0%B4%3A+%D0%BA%D1%80%D1%83%D0%BF%D0%BD%D0%BE%D0%B5%22+ORDER+BY+summary%2C+priority%2C+createdDate+ASC${FILTERQ_POST}"
             "${FILTERQ_PRE}%D0%9A%D0%BE%D0%B4%3A+%D0%BC%D0%B5%D0%BB%D0%BA%D0%BE%D0%B5%22+ORDER+BY+summary%2C+priority%2C+createdDate+ASC${FILTERQ_POST}"
             "${FILTERQ_PRE}%D0%A1%D0%B0%D0%B9%D1%82%22+ORDER+BY+priority%2C+createdDate%2C+summary+ASC${FILTERQ_POST}")
    FILTERF=(new.xml view-big.xml view-small.xml code-big.xml code-small.xml site.xml)

    if [[ $FLAGL == 0 ]]; then # скачиваем XML из JIRA
        FILTERXQ_PRE="https://jira.yandex-team.ru/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?jqlQuery=project+%3D+LEGO+AND+resolution+%3D+Fixed+AND+status+in+%28Resolved%2C+Closed%29+AND+resolved+%3E+${SJDATE}+AND+resolved+%3C%3D+${EJDATE}+AND+fixVersion+%3D+%22${SHORTVERSION}%22+AND+${FILTER_V_EXCLUDE}component+%3D+%22Changelog%3A+"
        FILTERXQ_POST="&tempMax=500"
        FILTERXQ=("${FILTERXQ_PRE}%D0%9D%D0%BE%D0%B2%D0%BE%D0%B5%22+ORDER+BY+summary%2C+priority%2C+createdDate+ASC${FILTERXQ_POST}"
                  "${FILTERXQ_PRE}%D0%92%D0%B8%D0%B4%3A+%D0%BA%D1%80%D1%83%D0%BF%D0%BD%D0%BE%D0%B5%22+ORDER+BY+summary%2C+priority%2C+createdDate+ASC${FILTERXQ_POST}"
                  "${FILTERXQ_PRE}%D0%92%D0%B8%D0%B4%3A+%D0%BC%D0%B5%D0%BB%D0%BA%D0%BE%D0%B5%22+ORDER+BY+summary%2C+priority%2C+createdDate+ASC${FILTERXQ_POST}"
                  "${FILTERXQ_PRE}%D0%9A%D0%BE%D0%B4%3A+%D0%BA%D1%80%D1%83%D0%BF%D0%BD%D0%BE%D0%B5%22+ORDER+BY+summary%2C+priority%2C+createdDate+ASC${FILTERXQ_POST}"
                  "${FILTERXQ_PRE}%D0%9A%D0%BE%D0%B4%3A+%D0%BC%D0%B5%D0%BB%D0%BA%D0%BE%D0%B5%22+ORDER+BY+summary%2C+priority%2C+createdDate+ASC${FILTERXQ_POST}"
                  "${FILTERXQ_PRE}%D0%A1%D0%B0%D0%B9%D1%82%22+ORDER+BY+priority%2C+createdDate%2C+summary+ASC${FILTERXQ_POST}")

        if [[ $JUSER == 0 ]]; then JUSER=$(whoami); fi

        JPYAARGS="-u $JUSER"
        for ((i=0; i<${#FILTERT[@]}; i++)); do
            JPYAARGS="$JPYAARGS ${FILTERF[$i]}=${FILTERXQ[i]}"
        done
        ./jpya $JPYAARGS
    fi

    # проверка на доступность файлов
    BADFILES=()
    for BADFILE in ${FILTERF[@]}; do
        if [[ ! -e $BADFILE ]]; then
            BADFILES=("${BADFILES[@]}" "$BADFILE")
        fi
    done
    if [ ${#BADFILES[@]} != 0 ]; then
        echo "Файлы не найдены:" >&2
        for BADFILE in ${BADFILES[@]}; do
            echo $BADFILE >&2
        done # то, что успели скачать, не удалять - может понадобиться при поиске проблем
    else # все файлы найдены
        if [[ -e $CLOUTTMP ]]; then
            rm $CLOUTTMP
        fi
        echo "<changelog><full-version>$VERSION</full-version><short-version>$SHORTVERSION</short-version><date-from>$SDATE</date-from><date-to>$EDATE</date-to><rev-prev>$PREV</rev-prev><rev-current>$CREV</rev-current><filters>" >>$CLOUTTMP
        for ((x=0; x<${#FILTERT[@]}; x++)); do
            echo "<filter title=\"${FILTERT[$x]}\" query-printable=\"${FILTERQ[$x]}\">" >>$CLOUTTMP
            cat ${FILTERF[$x]} >>$CLOUTTMP
            echo "</filter>" >>$CLOUTTMP
        done
        echo "</filters></changelog>" >>$CLOUTTMP

        xsltproc changeloger.xsl $CLOUTTMP

        rm $CLOUTTMP
        if [[ $FLAGL == 0 ]]; then # если файлы качались, чистим за собой
            for XMLFILE in ${FILTERF[@]}; do
                rm $XMLFILE
            done
        fi
    fi
fi

