public PurchaseContext(string currentState)
        {
            PurchaseStates purchaseStates = (PurchaseStates)Enum.Parse(typeof(PurchaseStates), currentState);

            switch (purchaseStates)
            {
            case PurchaseStates.Created:
                State = new Requested(purchaseStates);
                break;

            case PurchaseStates.Accepted:
                State = new Accepted(purchaseStates);
                break;

            case PurchaseStates.ReadyToShip:
                State = new ReadyToDepart(purchaseStates);
                break;

            case PurchaseStates.ConfirmShip:
                State = new ConfirmDepart(purchaseStates);
                break;

            case PurchaseStates.Shipped:
                State = new Shipped(purchaseStates);
                break;

            case PurchaseStates.Received:
                State = new Received(purchaseStates);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(purchaseStates), purchaseStates, null);
            }
        }
 public Received(PurchaseStates state) : base(state)
 {
     DisplayText = "Received";
     CommandText = "Receive products";
     NextState   = null;
 }
 public Shipped(PurchaseStates state) : base(state)
 {
     DisplayText = "Shipped";
     CommandText = "Ship";
     NextState   = new Received(PurchaseStates.Received);
 }
 public ConfirmDepart(PurchaseStates state) : base(state)
 {
     DisplayText = "Shipment confirmed";
     CommandText = "Confirm Shipment";
     NextState   = new Shipped(PurchaseStates.Shipped);
 }
 public ReadyToDepart(PurchaseStates state) : base(state)
 {
     DisplayText = "Ready to ship";
     CommandText = "Ready to ship";
     NextState   = new ConfirmDepart(PurchaseStates.ConfirmShip);
 }
 public Accepted(PurchaseStates state) : base(state)
 {
     NextState   = new ReadyToDepart(PurchaseStates.ReadyToShip);
     DisplayText = "Accepted";
     CommandText = "Accept Request";
 }
 public Requested(PurchaseStates state) : base(state)
 {
     NextState   = new Accepted(PurchaseStates.Accepted);
     DisplayText = "Created";
     CommandText = "Create";
 }
 protected PurchaseState(PurchaseStates state)
 {
     CurrentState = state;
 }
 public Canceled(PurchaseStates state) : base(state)
 {
     DisplayText = "Canceled";
     CommandText = "Cancel request";
     NextState   = null;
 }