package com.github.butterbrother.s2s_connection_checker.CmdLine;

/*
* Copyright (C) 2016  Oleg Bobukh <o.bobukh@yandex.ru>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
*/

import java.nio.file.Path;

/**
 * Распарсенные параметры командной строки.
 * Хранилище для них.
 * Получается в результате работы {@link CmdLineParser#parseCmdLine(String...)}.
 */
public class CmdLineOpts implements
        Comparable<CmdLineOpts> {
    private boolean serverMode;
    private Path configFilePath;
    private boolean enableDebug;

    /**
     * Инициализация.
     *
     * @param serverMode        флаг серверного режима. Если true - приложение работает как сервер
     * @param configFilePath    Путь к файлу конфигурации
     * @param enableDebug       Флаг отладки. Если true - отладочные сообщения выводятся в лог/на экран
     */
    CmdLineOpts(boolean serverMode, Path configFilePath, boolean enableDebug) {
        this.serverMode = serverMode;
        this.configFilePath = configFilePath;
        this.enableDebug = enableDebug;
    }

    /**
     * Режим работы
     *
     * @return true - режим сервиса, false - режим клиента
     */
    public boolean isServerMode() {
        return serverMode;
    }

    /**
     * Получение пути к файлу конфигурации.
     * <p>
     * Этот путь передаётся из аргументов командной строки.
     * Парсер {@link CmdLineParser} не проверяет корректность данного файла,
     * просто проверяется наличие и факт, что это файл.
     *
     * @return путь к файлу конфигурации
     */
    public Path getConfigFilePath() {
        return configFilePath;
    }

    /**
     * Проверка, что есть ключ, включающий отладку.
     * @return  разрешение отладки
     */
    public boolean debugEnabled() { return enableDebug; }
    /**
     * Для сравнения с другими объектами
     *
     * @param o другой объект
     * @return  результат сравнения
     */
    @Override
    public int compareTo(CmdLineOpts o) {
        int cmdServerMode = serverMode ? 1 : 0;
        int cmpServerMode = serverMode ? 1 : 0;

        int localDebugMode = enableDebug ? 1 : 0;
        int remoteDebugMode = o.enableDebug ? 1 : 0;

        int pathCompare = configFilePath.toAbsolutePath().compareTo(o.getConfigFilePath().toAbsolutePath());

        return cmdServerMode - cmpServerMode + localDebugMode - remoteDebugMode + pathCompare;
    }

    /**
     * Для определения схожести.
     *
     * @param o другой объект
     * @return  true - это одинаковые объекты.
     * Т.е. совпадает режим работы, отладки и путь к файлу конфигурации
     */
    @Override
    public boolean equals(Object o) {
        return o instanceof CmdLineOpts
                && serverMode == ((CmdLineOpts) o).isServerMode()
                && configFilePath.toAbsolutePath().equals(((CmdLineOpts) o).getConfigFilePath().toAbsolutePath());
    }
}
