public IHttpActionResult AddTranToWatch(LogDto data)
        {
            var logRecord   = _context.Log.SingleOrDefault(l => l.TrainId == data.TrainId);
            var nextStation = FindNextStationHelpers.FindNextStation(data.TrainId, data.Direction, -1);
            var lastStop    = _context.Trains.Single(t => t.TID == data.TrainId).StartStation;

            if (nextStation == -5)
            {
                return(BadRequest());
            }
            int locationLogId = -2;

            //Add new record to LocationLog If only status is 1(active Train)
            if (data.Status != "Active")
            {
                return(Conflict());
            }
            {
                var location = new LocationLog {
                    TrainId = data.TrainId, DateTime = DateTime.Now.ToShortDateString()
                };
                _context.Location.Add(location);
                _context.SaveChanges();
                locationLogId = location.LocationLogId;
                string path = $"Train-id-{data.TrainId}/Train-on-{data.Direction}-{DateTime.Now:y-MM-dd-HH-mm}.txt";
                FileHandler.WriteToFile(path, $"Created :{DateTime.Now:y-MM-dd-HH-mm}");
                if (!ActiveTrainDetails.ActiveTrainDictionary.ContainsKey(data.TrainId))
                {
                    ActiveTrainDetails.ActiveTrainDictionary.Add(data.TrainId, new ActiveTrain(path));
                }
                else
                {
                    ActiveTrainDetails.ActiveTrainDictionary[data.TrainId].PinLocations.Clear();
                    ActiveTrainDetails.ActiveTrainDictionary[data.TrainId].file = path;
                }
            }

            //check whether there is existing record on log table if not add new one
            if (logRecord != null)
            {
                logRecord.Status       = data.Status;
                logRecord.LogId        = locationLogId;
                logRecord.Direction    = data.Direction;
                logRecord.StartTime    = DateTime.Now.TimeOfDay.ToString(@"hh\:mm");
                logRecord.NextStop     = nextStation;
                logRecord.LastStop     = lastStop;
                logRecord.MaxSpeed     = logRecord.Speed = 0;
                logRecord.Delay        = TimeSpan.Zero;
                logRecord.LastLocation = logRecord.LastReceive = "";
            }
            else
            {
                var log = new Log
                {
                    TrainId     = data.TrainId,
                    DeviceId    = _context.Devices.First(d => d.TID == data.TrainId).DID,
                    Delay       = TimeSpan.Zero,
                    Status      = data.Status,
                    LogId       = locationLogId,
                    Direction   = data.Direction,
                    StartTime   = DateTime.Now.TimeOfDay.ToString(@"hh\:mm"),
                    NextStop    = nextStation,
                    LastStop    = lastStop,
                    LastReceive = TimeSpan.Zero.ToString(@"hh\:mm"),
                };
                _context.Log.Add(log);
            }

            _context.SaveChanges();
            return(Ok("Activated"));
        }
        //Update LogTable
        private void UpdateLog(SaveData str1, SaveData str2, int trainId, bool direction, double speed)
        {
            if (string.IsNullOrEmpty(str1.Lo))
            {
                return;
            }
            //Last and Current Location difference
            //Last location
            var location = str1.Lo.Split(':');
            var point1   = new GeoCoordinate(Convert.ToDouble(location[0]), Convert.ToDouble(location[1]));

            //Current location
            location = str2.Lo.Split(':');
            var point2 = new GeoCoordinate(Convert.ToDouble(location[0]), Convert.ToDouble(location[1]));

            var gap = point1.GetDistanceTo(point2);

            //Get relevant LogTable recode
            var log = _dbContext.Log.Single(l => l.TrainId == trainId);

            //Get Log recodes next stop station data
            var station       = _dbContext.Stations.Single(s => s.SID == log.NextStop);
            var locationSplit = station.Location.Split(':');
            var nextStop      = new GeoCoordinate(Convert.ToDouble(locationSplit[0]), Convert.ToDouble(locationSplit[1]));

            //Get data about next stop station timetable
            var stopAt   = _dbContext.StopAts.SingleOrDefault(s => (s.TID == trainId) && (s.Direction == direction) && (s.SID == station.SID));
            var distance = point2.GetDistanceTo(nextStop);

            Debug.WriteLine("gap between last receive point : " + gap);
            Debug.WriteLine("gap between next stop : " + distance);

            //Train moves
            if (_defaultGap < gap)
            {
                //distance to Next stop station
                if (_defaultSpeed > speed)
                {
                    speed = _defaultSpeed;
                }
                //Time to arrive next station
                var time         = TimeSpan.FromSeconds(Math.Round(distance / (speed * 10 / 36), 2));
                var estimateTime = DateTime.Now.TimeOfDay + time;
                var delay        = estimateTime.Subtract(TimeSpan.FromSeconds(stopAt.Atime)).Duration();
                _dbContext.Location.Single(l => l.LocationLogId == log.LogId).Delay = (int)delay.TotalSeconds;
                log.Status = delay.TotalMinutes < 5 ? "Delay less than 5 min" : "Delayed";
                log.Delay  = delay;
            }
            //Train stops
            else
            {
                if (_defaultPlatformLength > distance)
                {
                    log.Status   = $"Stop At {station.Name}";
                    log.LastStop = log.NextStop;
                    log.NextStop = FindNextStationHelpers.FindNextStation(log.TrainId, log.Direction, log.NextStop);
                    if (log.NextStop == -1)
                    {
                        log.LogId   = -2;
                        log.Status  = $"At End Station";
                        log.EndTime = DateTime.Now.TimeOfDay.ToString(@"hh\:mm");
                    }
                }
                else
                {
                    var lastStop           = _dbContext.Stations.Single(s => s.SID == log.LastStop);
                    var lastStopLocation   = lastStop.Location.Split(':');
                    var distanceToLastStop =
                        point2.GetDistanceTo(new GeoCoordinate(Convert.ToDouble(lastStopLocation[0]),
                                                               Convert.ToDouble(lastStopLocation[1])));
                    log.Status = _defaultPlatformLength > distanceToLastStop ? $"Stop At {lastStop.Name}" : "Waiting For Signals";
                }
            }
            _dbContext.SaveChanges();
            _writeToFile = $"\nSpeed:{log.Speed},Status:{log.Status},Delay:{log.Delay}";
        }