﻿/*
 * 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;

using Abstractions;
using System;
using System.Threading.Tasks;

public sealed class ProducerProcess : Process
{
    private readonly IStateManager<ProducerState> _stateManager;
    private readonly IEstablishNewChannel _producer;

    public ProducerProcess(
        Guid correlationId,
        IStateManager<ProducerState> stateManager,
        IEstablishNewChannel producer) : base(correlationId)
    {
        _stateManager = stateManager;
        _producer = producer;
    }

    public override async ValueTask DisposeAsync()
    {
        _stateManager.SetState(ProducerState.Closed);
        CancellationTokenSource.Cancel();
        await _producer.DisposeAsync().ConfigureAwait(false);
    }

    protected override void CalculateState()
    {
        if (_stateManager.IsFinalState())
            return;

        if (ExecutorState == ExecutorState.Faulted)
        {
            _stateManager.SetState(ProducerState.Faulted);
            return;
        }

        switch (ChannelState)
        {
            case ChannelState.ClosedByServer:
            case ChannelState.Disconnected:
                _stateManager.SetState(ProducerState.Disconnected);
                _ = _producer.EstablishNewChannel(CancellationTokenSource.Token);
                return;
            case ChannelState.Connected:
                _stateManager.SetState(ProducerState.Connected);
                return;
        }
    }
}
