using MetadataExtractor;
using System.Collections.ObjectModel;
using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Properties;
using View_by_Distance.Shared.Models.Stateless.Methods;

namespace View_by_Distance.Metadata.Models.Stateless.Methods;

public interface IMetadata
{

    enum DistanceUnit
    {
        Miles,
        NauticalMiles,
        Kilometers,
        Meters
    }

    ExifDirectory TestStatic_GetExifDirectory(FilePath filePath, DeterministicHashCode deterministicHashCode) =>
        GetExifDirectory(filePath, deterministicHashCode);
    static ExifDirectory GetExifDirectory(FilePath filePath, DeterministicHashCode deterministicHashCode) =>
        Exif.GetExifDirectory(filePath, deterministicHashCode);

    string? TestStatic_GetMaker(ExifDirectory? exifDirectory) =>
        GetMaker(exifDirectory);
    static string? GetMaker(ExifDirectory? exifDirectory) =>
        Base.GetMaker(exifDirectory?.ExifBaseDirectories);

    string? TestStatic_GetModel(ExifDirectory? exifDirectory) =>
        GetModel(exifDirectory);
    static string? GetModel(ExifDirectory? exifDirectory) =>
        Base.GetModel(exifDirectory?.ExifBaseDirectories);

    ReadOnlyCollection<string> TestStatic_GetKeywords(ExifDirectory? exifDirectory) =>
        GetKeywords(exifDirectory);
    static ReadOnlyCollection<string> GetKeywords(ExifDirectory? exifDirectory) =>
        Base.GetKeywords(exifDirectory?.ExifBaseDirectories);

    string? TestStatic_GetOutputResolution(ExifDirectory? exifDirectory) =>
        GetOutputResolution(exifDirectory);
    static string? GetOutputResolution(ExifDirectory? exifDirectory) =>
        Face.GetOutputResolution(exifDirectory?.PngDirectories);

    string? TestStatic_GetFaceEncoding(ExifDirectory? exifDirectory) =>
        GetFaceEncoding(exifDirectory);
    static string? GetFaceEncoding(ExifDirectory? exifDirectory) =>
        Face.GetFaceEncoding(exifDirectory?.PngDirectories);

    GeoLocation? TestStatic_GeoLocation(ExifDirectory? exifDirectory) =>
        GeoLocation(exifDirectory);
    static GeoLocation? GeoLocation(ExifDirectory? exifDirectory) =>
        GPS.GeoLocation(exifDirectory?.GpsDirectories);

    double? TestStatic_GetDistance(double originLatitude, double originLongitude, double destinationLatitude, double destinationLongitude, int decimalPlaces = 1, DistanceUnit distanceUnit = DistanceUnit.Miles) =>
        GetDistance(originLatitude, originLongitude, destinationLatitude, destinationLongitude, decimalPlaces, distanceUnit);
    static double? GetDistance(double originLatitude, double originLongitude, double destinationLatitude, double destinationLongitude, int decimalPlaces = 1, DistanceUnit distanceUnit = DistanceUnit.Miles) =>
        GPS.GetDistance(originLatitude, originLongitude, destinationLatitude, destinationLongitude, decimalPlaces, distanceUnit);

    Action<string> TestStatic_SetExifDirectoryCollection(IRename rename, IRenameConfiguration renameConfiguration, A_Metadata metadata, List<string> distinct, List<(bool, FilePath, FileInfo, ExifDirectory, ReadOnlyCollection<FileHolder>)> collection) =>
        SetExifDirectoryCollection(rename, renameConfiguration, metadata, distinct, collection);
    static Action<string> SetExifDirectoryCollection(IRename rename, IRenameConfiguration renameConfiguration, A_Metadata metadata, List<string> distinct, List<(bool, FilePath, FileInfo, ExifDirectory, ReadOnlyCollection<FileHolder>)> collection) =>
        Get.SetExifDirectoryCollection(rename, renameConfiguration, metadata, distinct, collection);

    ReadOnlyDictionary<string, List<FileHolder>> TestStatic_GetKeyValuePairs(IEnumerable<string> files) =>
        GetKeyValuePairs(files);
    static ReadOnlyDictionary<string, List<FileHolder>> GetKeyValuePairs(IEnumerable<string> files) =>
        Get.GetKeyValuePairs(files);

}