using System.Collections.ObjectModel;
using View_by_Distance.Shared.Models;

namespace View_by_Distance.Map.Models.Stateless;

internal abstract class DecadeLogic
{

    internal static string GetDecade(MappingFromItem? mappingFromItem, DateOnly? dateOnly)
    {
        string result;
        string year;
        if (mappingFromItem is null && dateOnly is null)
            throw new NotSupportedException();
        if (dateOnly is not null)
        {
            year = dateOnly.Value.Year.ToString();
            result = year[3] > '4' ? $"#{year[..3]}+" : $"#{year[..3]}-";
        }
        else if (mappingFromItem is null)
            throw new NotSupportedException();
        else if (mappingFromItem.DateTimeOriginal is null)
        {
            year = mappingFromItem.MinimumDateTime.Year.ToString();
            result = year[3] > '4' ? $"#{year[..3]}+" : $"#{year[..3]}-";
        }
        else
        {
            year = mappingFromItem.DateTimeOriginal.Value.Year.ToString();
            result = year[3] > '4' ? $"^{year[..3]}+" : $"^{year[..3]}-";
        }
        return result;
    }

    internal static void SetCreationTime(MappingFromItem mappingFromItem, ReadOnlyCollection<LocationContainer> locationContainers)
    {
        DateTime dateTime;
        foreach (LocationContainer locationContainer in locationContainers)
        {
            dateTime = mappingFromItem.DateTimeOriginal is null ? mappingFromItem.MinimumDateTime : mappingFromItem.DateTimeOriginal.Value;
            if (locationContainer.CreationDateOnly.Year != dateTime.Year || locationContainer.CreationDateOnly.Month != dateTime.Month || locationContainer.CreationDateOnly.Day != dateTime.Day)
            {
                if (!File.Exists(locationContainer.FilePath.FullName))
                    continue;
                File.SetCreationTime(locationContainer.FilePath.FullName, dateTime);
            }
        }
    }

    internal static void MoveToDecade(Property.Models.Configuration propertyConfiguration, MappingFromItem mappingFromItem, ReadOnlyCollection<LocationContainer> locationContainers)
    {
        string halfDecade;
        string checkDirectory;
        string? yearDirectory;
        string yearDirectoryName;
        string personNameDirectoryName;
        string? personKeyFormattedDirectory;
        string? personKeyFormattedDirectoryName;
        foreach (LocationContainer locationContainer in locationContainers)
        {
            if (string.IsNullOrEmpty(locationContainer.FilePath.DirectoryFullPath))
                continue;
            personNameDirectoryName = Path.GetFileName(locationContainer.FilePath.DirectoryFullPath);
            yearDirectory = Path.GetDirectoryName(locationContainer.FilePath.DirectoryFullPath);
            if (string.IsNullOrEmpty(yearDirectory))
                continue;
            yearDirectoryName = Path.GetFileName(yearDirectory);
            personKeyFormattedDirectory = Path.GetDirectoryName(yearDirectory);
            if (string.IsNullOrEmpty(personKeyFormattedDirectory))
                continue;
            personKeyFormattedDirectoryName = Path.GetFileName(personKeyFormattedDirectory);
            if (personKeyFormattedDirectoryName.Length != propertyConfiguration.PersonBirthdayFormat.Length)
                break;
            halfDecade = GetDecade(mappingFromItem, null);
            if (halfDecade == yearDirectoryName)
                continue;
            checkDirectory = Path.Combine(personKeyFormattedDirectory, halfDecade, personNameDirectoryName);
            if (!File.Exists(locationContainer.FilePath.FullName))
                continue;
            if (!Directory.Exists(checkDirectory))
                _ = Directory.CreateDirectory(checkDirectory);
            File.Move(locationContainer.FilePath.FullName, Path.Combine(checkDirectory, locationContainer.FilePath.Name));
        }
    }

}