// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

namespace System.Drawing.Imaging;

public sealed class FrameDimension
{
    // Frame dimension GUIDs, from sdkinc\imgguids.h
    private static readonly FrameDimension s_time = new(new Guid("{6aedbd6d-3fb5-418a-83a6-7f45229dc872}"));
    private static readonly FrameDimension s_resolution = new(new Guid("{84236f7b-3bd3-428f-8dab-4ea1439ca315}"));
    private static readonly FrameDimension s_page = new(new Guid("{7462dc86-6180-4c7e-8e3f-ee7333a7a483}"));

    private readonly Guid _guid;

    /// <summary>
    /// Initializes a new instance of the <see cref='FrameDimension'/> class with the specified GUID.
    /// </summary>
    public FrameDimension(Guid guid)
    {
        _guid = guid;
    }

    /// <summary>
    /// Specifies a global unique identifier (GUID) that represents this <see cref='FrameDimension'/>.
    /// </summary>
    public Guid Guid
    {
        get { return _guid; }
    }

    /// <summary>
    /// The time dimension.
    /// </summary>
    public static FrameDimension Time
    {
        get { return s_time; }
    }

    /// <summary>
    /// The resolution dimension.
    /// </summary>
    public static FrameDimension Resolution
    {
        get { return s_resolution; }
    }

    /// <summary>
    /// The page dimension.
    /// </summary>
    public static FrameDimension Page => s_page;

    /// <summary>
    /// Returns a value indicating whether the specified object is an <see cref='FrameDimension'/> equivalent to
    /// this <see cref='FrameDimension'/>.
    /// </summary>
    public override bool Equals([NotNullWhen(true)] object? o) => o is FrameDimension format && _guid == format._guid;

    public override int GetHashCode()
    {
        return _guid.GetHashCode();
    }

    /// <summary>
    ///  Converts this <see cref='FrameDimension'/> to a human-readable string.
    /// </summary>
    public override string ToString()
    {
        if (this == s_time)
        {
            return "Time";
        }

        if (this == s_resolution)
        {
            return "Resolution";
        }

        if (this == s_page)
        {
            return "Page";
        }

        return $"[FrameDimension: {_guid}]";
    }
}
