using System;

// ReSharper disable MemberCanBePrivate.Global

namespace NodePipeline.Engine.Abstractions.Validation;

public readonly struct NodePortKey(string nodeType, string portName, bool input) : IEquatable<NodePortKey>
{
    public string NodeType { get; } = nodeType;
    public string PortName { get; } = portName;
    public bool Input { get; } = input;

    public bool Equals(NodePortKey other)
    {
        return string.Equals(NodeType, other.NodeType, StringComparison.Ordinal) &&
               string.Equals(PortName, other.PortName, StringComparison.Ordinal) &&
               Input == other.Input;
    }

    public override bool Equals(object? obj)
    {
        return obj is NodePortKey other && Equals(other);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            var hash = 17;
            hash = hash * 23 + (NodeType?.GetHashCode() ?? 0);
            hash = hash * 23 + (PortName?.GetHashCode() ?? 0);
            hash = hash * 23 + Input.GetHashCode();
            return hash;
        }
    }

    public static bool operator ==(NodePortKey left, NodePortKey right)
    {
        return left.Equals(right);
    }

    public static bool operator !=(NodePortKey left, NodePortKey right)
    {
        return !left.Equals(right);
    }

    public override string ToString()
    {
        return $"{NodeType}:{PortName}:{(Input ? "In" : "Out")}";
    }
}