using Microsoft.Extensions.Configuration;
using Phares.Shared;
using Serilog;
using View_by_Distance.Delete.By.Relative.Models;
using View_by_Distance.Property.Models;
using View_by_Distance.Shared.Models.Methods;

namespace View_by_Distance.Delete.By.Relative;

public class DeleteByRelative
{

    public DeleteByRelative(List<string> args, IsEnvironment isEnvironment, IConfigurationRoot configurationRoot, AppSettings appSettings, string workingDirectory, bool isSilent, IConsole console)
    {
        if (isSilent)
        { }
        if (console is null)
        { }
        string relativePath;
        string checkFileName;
        string searchPattern = "*";
        long ticks = DateTime.Now.Ticks;
        ILogger? log = Log.ForContext<DeleteByRelative>();
        Configuration configuration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot);
        configuration.Update();
        log.Information(configuration.RootDirectory);
        int length = configuration.RootDirectory.Length;
        if (string.IsNullOrEmpty(appSettings.CompareRootDirectory) || Path.GetFullPath(appSettings.CompareRootDirectory) == Path.GetFullPath(configuration.RootDirectory))
            throw new Exception("Check AppSettings file!");
        IEnumerable<(string directory, string[] files)> leftCollection = Shared.Models.Stateless.Methods.IFileHolder.GetFiles(configuration.RootDirectory, searchPattern);
        List<string> leftRelativeFiles = new();
        foreach ((_, string[] files) in leftCollection)
        {
            foreach (string file in files)
            {
                relativePath = Shared.Models.Stateless.Methods.IPath.GetRelativePath(file, length);
                leftRelativeFiles.Add(Path.GetFullPath(string.Concat(appSettings.CompareRootDirectory, relativePath)));
            }
        }
        List<string> deleteFiles = new();
        IEnumerable<(string, string[])> rightCollection = Shared.Models.Stateless.Methods.IFileHolder.GetFiles(appSettings.CompareRootDirectory, searchPattern);
        foreach ((_, string[] files) in rightCollection)
        {
            foreach (string file in files)
            {
                checkFileName = Path.GetFullPath(file);
                if (!leftRelativeFiles.Contains(checkFileName))
                    continue;
                deleteFiles.Add(checkFileName);
            }
        }
        string? alongSideDirectory;
        string directoryName = Path.GetFileName(appSettings.CompareRootDirectory);
        if (Path.GetPathRoot(appSettings.CompareRootDirectory) == appSettings.CompareRootDirectory)
            alongSideDirectory = appSettings.CompareRootDirectory;
        else
            alongSideDirectory = Path.GetDirectoryName(appSettings.CompareRootDirectory);
        if (alongSideDirectory is null)
            throw new NullReferenceException(nameof(alongSideDirectory));
        string deleteLog = Path.Combine(alongSideDirectory, $"{directoryName}-{ticks}.tsv");
        File.WriteAllLines(deleteLog, deleteFiles);
        log.Information($"Ready to delete {deleteFiles.Count} file(s)? See <{deleteLog}>");
        for (int y = 0; y < int.MaxValue; y++)
        {
            log.Information("Press \"Y\" key to delete file(s) or close console to not delete files");
            if (Console.ReadKey().Key == ConsoleKey.Y)
                break;
        }
        log.Information(". . .");
        foreach (string deleteFile in deleteFiles)
        {
            File.Delete(deleteFile);
            checkFileName = $"{deleteFile}.id";
            if (!File.Exists(checkFileName))
                continue;
            File.Delete(checkFileName);
        }
        for (int i = 1; i < 5; i++)
            _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(appSettings.CompareRootDirectory);
    }

}