using MetadataExtractor;
using View_by_Distance.Shared.Models;

namespace View_by_Distance.Metadata.Models.Stateless.Methods;

public interface IMetadata
{

    enum DistanceUnit
    {
        Miles,
        NauticalMiles,
        Kilometers,
        Meters
    }

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

    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);

    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);

    // string? TestStatic_GetFaceEncoding(IReadOnlyList<MetadataExtractor.Directory> directories) =>
    //     GetFaceEncoding(directories);
    // static string? GetFaceEncoding(IReadOnlyList<MetadataExtractor.Directory> directories) =>
    //     Metadata.GetFaceEncoding(directories);

    // string? TestStatic_GetOutputResolution(IReadOnlyList<MetadataExtractor.Directory> directories) =>
    //     GetOutputResolution(directories);
    // static string? GetOutputResolution(IReadOnlyList<MetadataExtractor.Directory> directories) =>
    //     Metadata.GetOutputResolution(directories);

    // Dictionary<string, MetadataExtractorDirectory> TestStatic_GetMetadataCollection(FileInfo fileInfo, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions) =>
    //     GetMetadataCollection(fileInfo, subFileTuples, parseExceptions);
    // static Dictionary<string, MetadataExtractorDirectory> GetMetadataCollection(FileInfo fileInfo, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions) =>
    //     Metadata.GetMetadataCollection(fileInfo, subFileTuples, parseExceptions);

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

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

}