using System.Drawing.Imaging;
using System.Reflection;

namespace View_by_Distance.Shared.Models.Stateless.Methods;

public interface IProperty
{ // ...

    string TestStatic_DateTimeFormat();
    static string DateTimeFormat() => "yyyy:MM:dd HH:mm:ss";

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

    DateTime? TestStatic_GetDateTime(string dateTimeFormat, string? value) =>
        GetDateTime(dateTimeFormat, value);
    static DateTime? GetDateTime(string dateTimeFormat, string? value) =>
        Property.GetDateTime(dateTimeFormat, value);

    DateTime TestStatic_GetDateTime(Models.Property? property) =>
        GetDateTime(property);
    static DateTime GetDateTime(Models.Property? property) =>
        Property.GetDateTime(property);

    DateTime TestStatic_GetMinimumDateTime(Models.Property? property) =>
        GetMinimumDateTime(property);
    static DateTime GetMinimumDateTime(Models.Property? property) =>
        Property.GetMinimumDateTime(property);

    (int Season, string seasonName) TestStatic_GetSeason(int dayOfYear) =>
        GetSeason(dayOfYear);
    static (int Season, string seasonName) GetSeason(int dayOfYear) =>
        Property.GetSeason(dayOfYear);

    string TestStatic_GetDiffRootDirectory(string diffPropertyDirectory) =>
        GetDiffRootDirectory(diffPropertyDirectory);
    static string GetDiffRootDirectory(string diffPropertyDirectory) =>
        Property.GetDiffRootDirectory(diffPropertyDirectory);

    bool TestStatic_Any(Models.Container[] propertyHolderCollections) =>
        Any(propertyHolderCollections);
    static bool Any(Models.Container[] propertyHolderCollections) =>
        Property.Any(propertyHolderCollections);

    (bool?, string[]) TestStatic_IsWrongYear(string[] segments, string year) =>
        IsWrongYear(segments, year);
    static (bool?, string[]) IsWrongYear(string[] segments, string year) =>
        Property.IsWrongYear(segments, year);

    (bool?, string[]) TestStatic_IsWrongYear(Models.FileHolder fileHolder, DateTime? dateTimeOriginal, List<DateTime> dateTimes) =>
        IsWrongYear(fileHolder, dateTimeOriginal, dateTimes);
    static (bool?, string[]) IsWrongYear(Models.FileHolder fileHolder, DateTime? dateTimeOriginal, List<DateTime> dateTimes) =>
        Property.IsWrongYear(fileHolder, dateTimeOriginal, dateTimes);

    (DateTime?, DateTime?[], int?, string?) TestStatic_Get(Models.FileHolder fileHolder, bool isIgnoreExtension, bool isValidImageFormatExtension, bool populateId) =>
        Get(fileHolder, isIgnoreExtension, isValidImageFormatExtension, populateId);
    static (DateTime?, DateTime?[], int?, string?) Get(Models.FileHolder fileHolder, bool isIgnoreExtension, bool isValidImageFormatExtension, bool populateId) =>
        Property.Get(fileHolder, isIgnoreExtension, isValidImageFormatExtension, populateId);

    DateTime? TestStatic_GetDateTimeFromName(Models.FileHolder fileHolder) =>
        GetDateTimeFromName(fileHolder);
    static DateTime? GetDateTimeFromName(Models.FileHolder fileHolder) =>
        Property.GetDateTimeFromName(fileHolder);

    bool TestStatic_NameWithoutExtensionIsIdFormat(string fileNameWithoutExtension) =>
        NameWithoutExtensionIsIdFormat(fileNameWithoutExtension);
    static bool NameWithoutExtensionIsIdFormat(string fileNameWithoutExtension) =>
        Property.NameWithoutExtensionIsIdFormat(fileNameWithoutExtension);

    bool TestStatic_NameWithoutExtensionIsIdFormat(string[] validImageFormatExtensions, Models.FileHolder fileHolder) =>
        NameWithoutExtensionIsIdFormat(validImageFormatExtensions, fileHolder);
    static bool NameWithoutExtensionIsIdFormat(string[] validImageFormatExtensions, Models.FileHolder fileHolder) =>
        Property.NameWithoutExtensionIsIdFormat(validImageFormatExtensions, fileHolder);

    bool TestStatic_NameWithoutExtensionIsIdFormat(Models.FileHolder fileHolder) =>
        NameWithoutExtensionIsIdFormat(fileHolder);
    static bool NameWithoutExtensionIsIdFormat(Models.FileHolder fileHolder) =>
        NameWithoutExtensionIsIdFormat(fileHolder.NameWithoutExtension);

    List<DateTime> TestStatic_GetDateTimes(Models.Property property) =>
        GetDateTimes(property);
    static List<DateTime> GetDateTimes(Models.Property property) =>
        Property.GetDateTimes(property.CreationTime, property.LastWriteTime, property.DateTime, property.DateTimeDigitized, property.DateTimeFromName, property.DateTimeOriginal, property.GPSDateStamp);

    double TestStatic_GetStandardDeviation(IEnumerable<long> values, double average) =>
        GetStandardDeviation(values, average);
    static double GetStandardDeviation(IEnumerable<long> values, double average) =>
        Property.GetStandardDeviation(values, average);

    TimeSpan TestStatic_GetThreeStandardDeviationHigh(int minimum, Models.Container container) =>
        GetThreeStandardDeviationHigh(minimum, container);
    static TimeSpan GetThreeStandardDeviationHigh(int minimum, Models.Container container) =>
        Property.GetThreeStandardDeviationHigh(minimum, container);

    (int, List<DateTime>, List<Models.Item>) TestStatic_Get(Models.Container container, TimeSpan threeStandardDeviationHigh, int i) =>
        Get(container, threeStandardDeviationHigh, i);
    static (int, List<DateTime>, List<Models.Item>) Get(Models.Container container, TimeSpan threeStandardDeviationHigh, int i) =>
        Property.Get(container, threeStandardDeviationHigh, i);

    List<DateTime> TestStatic_GetDateTimes(DateTime creationTime, DateTime lastWriteTime, DateTime? dateTime, DateTime? dateTimeDigitized, DateTime? dateTimeFromName, DateTime? dateTimeOriginal, DateTime? gpsDateStamp) =>
        GetDateTimes(creationTime, lastWriteTime, dateTime, dateTimeDigitized, dateTimeFromName, dateTimeOriginal, gpsDateStamp);
    static List<DateTime> GetDateTimes(DateTime creationTime, DateTime lastWriteTime, DateTime? dateTime, DateTime? dateTimeDigitized, DateTime? dateTimeFromName, DateTime? dateTimeOriginal, DateTime? gpsDateStamp) =>
        Property.GetDateTimes(creationTime, lastWriteTime, dateTime, dateTimeDigitized, dateTimeFromName, dateTimeOriginal, gpsDateStamp);

    byte[] TestStatic_GetBytes(string value) =>
       GetBytes(value);
    static byte[] GetBytes(string value) =>
        Property.GetBytes(value);

    PropertyItem TestStatic_GetPropertyItem(ConstructorInfo constructorInfo, int id, short type, string value) =>
       GetPropertyItem(constructorInfo, id, type, value);
    static PropertyItem GetPropertyItem(ConstructorInfo constructorInfo, int id, short type, string value) =>
        Property.GetPropertyItem(constructorInfo, id, type, value);

}