namespace View_by_Distance.Shared.Models.Stateless.Methods;

public interface IId
{

    const int DeterministicHashCode = 9876543;

    static bool IsOffsetDeterministicHashCode(MetadataConfiguration metadataConfiguration) =>
        metadataConfiguration.Offset == DeterministicHashCode;

    string TestStatic_GetIntelligentId(MetadataConfiguration metadataConfiguration, long id, bool ignore) =>
        GetIntelligentId(metadataConfiguration, id, ignore);
    static string GetIntelligentId(MetadataConfiguration metadataConfiguration, long id, bool ignore) =>
        Id.GetIntelligentId(metadataConfiguration, id, ignore);

    int TestStatic_GetId(MetadataConfiguration metadataConfiguration, string intelligentId) =>
        GetId(metadataConfiguration, intelligentId);
    static int GetId(MetadataConfiguration metadataConfiguration, string intelligentId) =>
        Id.GetId(metadataConfiguration, intelligentId);

    string TestStatic_GetPaddedId(MetadataConfiguration metadataConfiguration, int id, bool? ignore, int? index) =>
        GetPaddedId(metadataConfiguration, id, ignore, index);
    static string GetPaddedId(MetadataConfiguration metadataConfiguration, int id, bool? ignore, int? index) =>
        Id.GetPaddedId(metadataConfiguration, id, ignore, index);

    string TestStatic_GetIgnoreFullPath(FilePath filePath, FileHolder fileHolder) =>
        GetIgnoreFullPath(filePath, fileHolder);
    static string GetIgnoreFullPath(FilePath filePath, FileHolder fileHolder) =>
        fileHolder.DirectoryName is null ?
            throw new NotSupportedException() :
            filePath.Id > -1 ?
                fileHolder.NameWithoutExtension[^1] == '9' ?
                    Path.Combine(fileHolder.DirectoryName, $"{fileHolder.NameWithoutExtension[..^1]}8{fileHolder.ExtensionLowered}") :
                    throw new NotSupportedException("High") :
                fileHolder.NameWithoutExtension[^1] == '1' ?
                    Path.Combine(fileHolder.DirectoryName, $"{fileHolder.NameWithoutExtension[..^1]}2{fileHolder.ExtensionLowered}") :
                    throw new NotSupportedException("Low");

    bool TestStatic_NameWithoutExtensionIsIntelligentIdFormat(MetadataConfiguration metadataConfiguration, string fileNameFirstSegment) =>
        NameWithoutExtensionIsIntelligentIdFormat(metadataConfiguration, fileNameFirstSegment);
    static bool NameWithoutExtensionIsIntelligentIdFormat(MetadataConfiguration metadataConfiguration, string fileNameFirstSegment) =>
        fileNameFirstSegment.Length - 1 == metadataConfiguration.IntMinValueLength && fileNameFirstSegment[^1] is '1' or '2' or '8' or '9' && fileNameFirstSegment.All(char.IsNumber);

    bool TestStatic_NameWithoutExtensionIsPaddedIntelligentIdFormat(MetadataConfiguration metadataConfiguration, int sortOrderOnlyLengthIndex, string fileNameFirstSegment) =>
        NameWithoutExtensionIsPaddedIntelligentIdFormat(metadataConfiguration, sortOrderOnlyLengthIndex, fileNameFirstSegment);
    static bool NameWithoutExtensionIsPaddedIntelligentIdFormat(MetadataConfiguration metadataConfiguration, int sortOrderOnlyLengthIndex, string fileNameFirstSegment) =>
        fileNameFirstSegment.Length == metadataConfiguration.IntMinValueLength + sortOrderOnlyLengthIndex + 1
        && fileNameFirstSegment[^1] is '1' or '2' or '8' or '9'
        && fileNameFirstSegment.All(char.IsNumber);

    bool TestStatic_NameWithoutExtensionIsIdFormat(MetadataConfiguration metadataConfiguration, FileHolder fileHolder) =>
        NameWithoutExtensionIsIdFormat(metadataConfiguration, fileHolder);
    static bool NameWithoutExtensionIsIdFormat(MetadataConfiguration metadataConfiguration, FileHolder fileHolder) =>
        Id.NameWithoutExtensionIsIdFormat(metadataConfiguration, fileHolder.NameWithoutExtension.Split('.')[0]);

    int TestStatic_GetDeterministicHashCode(byte[] value) =>
        GetDeterministicHashCode(value);
    static int GetDeterministicHashCode(byte[] value) =>
        Id.GetDeterministicHashCode(value);

}