using System.Reflection;

using anbs_cp.Classes;

using FileSplitter.Shared.Classes;
using FileSplitter.Shared.Enums;

string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? string.Empty;

//Инициализирую список параметров
ConsoleParamsParser consoleParser = new(Environment.GetCommandLineArgs());

//Приветственное сообщение
Console.WriteLine("********************************************************************************");
Console.WriteLine($"\t{Localization.AppTitle}");
Console.WriteLine($"\t{string.Format(Localization.AppVersion, assemblyVersion)}");
Console.WriteLine(
    $"\t{string.Format(Localization.AppCopyrights, DateTime.Now.Year == 2023 ? "2023" : $"2023 - {DateTime.Now.Year}")}");
Console.WriteLine("********************************************************************************");

//Прерываем, если нет параметров
if (!consoleParser.HasParam("split") && !consoleParser.HasParam("join"))
{
    Console.WriteLine(Localization.MessageNoParameters);
    return;
}

//Разделение файлов
if (consoleParser.HasParam("split"))
    FileSplit(consoleParser);

//Соединение файлов
if (consoleParser.HasParam("join"))
    FileJoin(consoleParser);

//Функция разделения файлов
static void FileSplit (ConsoleParamsParser @params)
{
    //Проверяю наличие параметров
    if (!@params.HasParam("-fn") || !@params.HasParam("-td") || !@params.HasParam("-ps"))
    {
        //- вывожу сообщение
        Console.WriteLine(Localization.MessageNoParametersForSplit);

        //- прерываю
        return;
    }

    //Получаю параметры
    //- имя исходного файла
    string fileName = @params.GetValue("-fn") ?? string.Empty;
    //- папка для сохранения разбиения
    string targetDir = @params.GetValue("-td") ?? string.Empty;
    //- размер части
    long partSize = TypeConverter.StrToInt64(@params.GetValue("-ps") ?? string.Empty);
    //- параметры
    List<FileSplitOptions> options = new();

    //Проверяю параметры разбиения
    //- отключена ли проверка хэша
    if (@params.HasParam("/NoCheckHash"))
        options.Add(FileSplitOptions.fsoNoCheckHash);
    //- нужно ли удалять исходный файл
    if (@params.HasParam("/DeleteSource"))
        options.Add(FileSplitOptions.fsoDeleteSourceFileAfterSplit);
    //- нужно ли шифровать файл информации
    if (@params.HasParam("/EncryptInfoFile"))
        options.Add(FileSplitOptions.fsoEncryptInfoFile);

    //Функция прогресса
    #pragma warning disable CS8622
    FileSplitterClass.OnProgress += OnProgress;
    #pragma warning restore CS8622

    //Выполняю разбиение
    FileSplitterClass.SplitFile(fileName, targetDir, partSize, options.AsReadOnly());
}

//Функция объединения
static void FileJoin (ConsoleParamsParser @params)
{
    //Проверяю наличие параметров
    if (!@params.HasParam("-ifn") || !@params.HasParam("-tfn"))
    {
        //- вывожу сообщение
        Console.WriteLine(Localization.MessageNoParametersForSplit);

        //- прерываю
        return;
    }

    //Получаю параметры
    //- имя файла с информацией о разбиении
    string infoFileName = @params.GetValue("-ifn") ?? string.Empty;
    //- имя целевого файла
    string targetFileName = @params.GetValue("-tfn") ?? string.Empty;
    //- параметры
    List<FileJoinOptions> options = new();

    //Проверяю параметры разбиения
    //- отключена ли проверка хэша
    if (@params.HasParam("/NoCheckHash"))
        options.Add(FileJoinOptions.fjoNoCheckHash);
    //- нужно ли удалять исходные файлы
    if (@params.HasParam("/DeleteSource"))
        options.Add(FileJoinOptions.fjoDeleteSourceFilesAfterJoin);
    //- нужно ли дешифровать файл информации
    if (@params.HasParam("/DecryptInfoFile"))
        options.Add(FileJoinOptions.fjoInfoFileIsEncrypted);
    //- нужно ли отключить проверку версии файла информации
    if (@params.HasParam("/IgnoreVersion"))
        options.Add(FileJoinOptions.fjoIgnoreSupportedScriptVersion);

    //Функция прогресса
    #pragma warning disable CS8622
    FileSplitterClass.OnProgress += OnProgress;
    #pragma warning restore CS8622

    //Выполняю объединение
    FileSplitterClass.JoinFile(infoFileName, targetFileName, options.AsReadOnly());
}

//Функция вывода прогресса
static void OnProgress (object sender, FileSplitterOnProgress args)
{
    //Вывод сообщения в консоль
    Console.WriteLine(args.Message);
}