Newer
Older
ValidState / Stop.cs
@Derek Comartin Derek Comartin on 25 Aug 2021 1 KB Reorganize
using System;

namespace AggregateConsistencyBoundary
{
    public class PickupStop : Stop
    {
        public PickupStop(int stopId, Address address, DateTime scheduled)
            : base(stopId, address, scheduled)
        {
            StopId = stopId;
            Address = address;
        }
    }

    public class DeliveryStop : Stop
    {
        public DeliveryStop(int stopId, Address address, DateTime scheduled)
            : base(stopId, address, scheduled)
        {
            StopId = stopId;
            Address = address;
        }
    }

    public abstract class Stop
    {
        public int StopId { get; protected set; }
        public StopStatus Status { get; private set; } = StopStatus.InTransit;
        public Address Address { get; protected set;}
        public DateTime Scheduled { get; }
        public DateTime? Departed { get;  protected set; }

        public Stop(int stopId, Address address, DateTime scheduled)
        {
            StopId = stopId;
            Address = address;
            Scheduled = scheduled;
        }

        public void Arrive()
        {
            if (Status != StopStatus.InTransit)
            {
                throw new InvalidOperationException("Stop has already arrived.");
            }

            Status = StopStatus.Arrived;
        }

        public void Depart()
        {
            if (Status == StopStatus.Departed)
            {
                throw new InvalidOperationException("Stop has already departed.");
            }

            if (Status == StopStatus.InTransit)
            {
                throw new InvalidOperationException("Stop hasn't arrived yet.");
            }

            Status = StopStatus.Departed;
            Departed = DateTime.UtcNow;
        }
    }

    public enum StopStatus
    {
        InTransit,
        Arrived,
        Departed
    }
}