private void ProcessShipment(int shipmentId, int droneId)
        {
            Random r = new Random();
            int travelTime;

            ShipmentBLL shipBLL = new ShipmentBLL();
            DroneBLL droneBLL = new DroneBLL();
            DroneShipmentActivityLogBLL logBLL = new DroneShipmentActivityLogBLL();
            BaseBLL baseBll = new BaseBLL();
            AddressBLL addressBll = new AddressBLL();

            // Start
            ShipmentInfo shipment = shipBLL.GetShipment(shipmentId);
            shipment.Status = ShipmentStatus.InTransit;
            shipment.DroneId = droneId;
            shipBLL.UpdateShipment(shipment);

            DroneShipmentActivityLogInfo log = new DroneShipmentActivityLogInfo();
            log.DroneId = droneId;
            log.ShipmentId = shipmentId;
            log.Message = "Beginning processing";
            logBLL.AddDroneShipmentActivityLog(log);

            // Go pick up shipment
            DroneInfo drone = droneBLL.GetDrone(droneId);
            drone.Status = DroneStatus.PickingUpShipment;
            droneBLL.UpdateDrone(drone);

            log.Message = "Travelling to shipment source for pickup";
            logBLL.AddDroneShipmentActivityLog(log);

            travelTime= r.Next(MIN_TRAVEL_TIME_IN_SECONDS, MAX_TRAVEL_TIME_IN_SECONDS);
            log.Message = string.Format("Estimated time to reach shipment source (in seconds): {0}", travelTime);
            logBLL.AddDroneShipmentActivityLog(log);

            TravelTo(droneBLL, drone, shipment.SourceAddress.Longitude, shipment.SourceAddress.Latitude, travelTime);

            // Deliver shipment

            log.Message = "Delivering shipment to destination";
            logBLL.AddDroneShipmentActivityLog(log);

            drone.Status = DroneStatus.DeliveringShipment;
            droneBLL.UpdateDrone(drone);

            travelTime = r.Next(MIN_TRAVEL_TIME_IN_SECONDS, MAX_TRAVEL_TIME_IN_SECONDS);
            log.Message = string.Format("Estimated time to reach shipment destination (in seconds): {0}", travelTime);
            logBLL.AddDroneShipmentActivityLog(log);

            TravelTo(droneBLL, drone, shipment.DestinationAddress.Longitude, shipment.DestinationAddress.Latitude, travelTime);

            // Shipment delivered
            shipment.Status = ShipmentStatus.Shipped;
            shipBLL.UpdateShipment(shipment);

            log.Message = "Shipment delivered";
            logBLL.AddDroneShipmentActivityLog(log);

            // Returning home
            log.Message = "Returning to base";
            logBLL.AddDroneShipmentActivityLog(log);
            drone.Status = DroneStatus.ReturningToBase;
            droneBLL.UpdateDrone(drone);

            // Find the nearest base and go there
            log.Message = "Locating the nearest base";
            logBLL.AddDroneShipmentActivityLog(log);

            var bases = baseBll.GetAll();
            BaseInfo nearestBase = null;
            double shortestDistance = double.MaxValue;
            foreach (var baseInfo in bases) {
                var distance = addressBll.GetDistanceKm((double)drone.Latitude, (double)drone.Longitude, (double)baseInfo.Address.Latitude, (double)baseInfo.Address.Longitude);
                if (distance < shortestDistance) {
                    shortestDistance = distance;
                    nearestBase = baseInfo;
                }
            }

            log.Message = string.Format("Nearest base is: {0}", nearestBase.Name);
            logBLL.AddDroneShipmentActivityLog(log);
            travelTime = r.Next(MIN_TRAVEL_TIME_IN_SECONDS, MAX_TRAVEL_TIME_IN_SECONDS);
            log.Message = string.Format("Estimated time to reach base (in seconds): {0}", travelTime);
            logBLL.AddDroneShipmentActivityLog(log);

            TravelTo(droneBLL, drone, nearestBase.Address.Longitude, nearestBase.Address.Latitude, travelTime);

            // End
            log.Message = "Now available";
            logBLL.AddDroneShipmentActivityLog(log);

            drone.Status = DroneStatus.Available;
            droneBLL.UpdateDrone(drone);
        }
 public ActionResult ShipmentLog(int shipmentId)
 {
     var logBll = new DroneShipmentActivityLogBLL();
     var logs = logBll.GetActivityByShipment(shipmentId);
     return View(logs);
 }