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

using Events;
using System;
using System.Threading;
using System.Threading.Tasks;

public abstract class Process : IProcess
{
    protected readonly CancellationTokenSource CancellationTokenSource;
    protected ChannelState ChannelState;
    protected ExecutorState ExecutorState;

    protected Process(Guid correlationId)
    {
        CancellationTokenSource = new CancellationTokenSource();
        ChannelState = ChannelState.Disconnected;
        ExecutorState = ExecutorState.Ok;
        CorrelationId = correlationId;
    }

    public Guid CorrelationId { get; }

    public void Start()
        => CalculateState();

    public abstract ValueTask DisposeAsync();

    public void Handle(IEvent e)
    {
        switch (e)
        {
            case ExecutorFaulted _:
                ExecutorState = ExecutorState.Faulted;
                break;
            case ChannelActivated _:
                ChannelState = ChannelState.Active;
                break;
            case ChannelClosedByServer _:
                ChannelState = ChannelState.ClosedByServer;
                break;
            case ChannelConnected _:
                ChannelState = ChannelState.Connected;
                break;
            case ChannelDeactivated _:
                ChannelState = ChannelState.Inactive;
                break;
            case ChannelDisconnected _:
                ChannelState = ChannelState.Disconnected;
                break;
            case ChannelReachedEndOfTopic _:
                ChannelState = ChannelState.ReachedEndOfTopic;
                break;
            case ChannelUnsubscribed _:
                ChannelState = ChannelState.Unsubscribed;
                break;
        }

        CalculateState();
    }

    protected abstract void CalculateState();
}
