﻿/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

namespace DotPulsar.Internal.Requests;

using DotPulsar.Internal.Abstractions;
using DotPulsar.Internal.PulsarApi;
using System;
using System.Diagnostics.CodeAnalysis;

public struct StandardRequest : IRequest
{
    private readonly ulong _requestId;
    private readonly ulong? _consumerId;
    private readonly ulong? _producerId;
    private readonly BaseCommand.Type? _commandType;

    private StandardRequest(ulong requestId, ulong? consumerId, ulong? producerId, BaseCommand.Type? commandType)
    {
        _requestId = requestId;
        _consumerId = consumerId;
        _producerId = producerId;
        _commandType = commandType;
    }

    public static StandardRequest WithRequestId(ulong requestId)
        => new(requestId, null, null, null);

    public static StandardRequest WithConsumerId(ulong requestId, ulong consumerId, BaseCommand.Type? commandType = null)
        => new(requestId, consumerId, null, commandType);

    public static StandardRequest WithProducerId(ulong requestId, ulong producerId, BaseCommand.Type? commandType = null)
        => new(requestId, null, producerId, commandType);

    public bool SenderIsConsumer(ulong consumerId)
        => _consumerId.HasValue && _consumerId.Value == consumerId;

    public bool SenderIsProducer(ulong producerId)
        => _producerId.HasValue && _producerId.Value == producerId;

    public bool IsCommandType(BaseCommand.Type commandType)
        => _commandType.HasValue && _commandType.Value == commandType;

#if NETSTANDARD2_0
    public bool Equals(IRequest other)
#else
        public bool Equals([AllowNull] IRequest other)
#endif
    {
        if (other is StandardRequest request)
            return _requestId.Equals(request._requestId);

        return false;
    }

    public override int GetHashCode()
        => HashCode.Combine(_requestId);
}
