public HttpResponseMessage Add(HttpRequestMessage request, HRMFileDto hrmFileDto)
        {
            return CreateHttpResponse(request, () =>
            {
                HttpResponseMessage response;

                var athlete = _athleteRepository.GetSingle(hrmFileDto.AthleteId);

                if (athlete == null)
                {
                    response = request.CreateErrorResponse(HttpStatusCode.NotFound, "Invalid Athlete");
                }
                else
                {
                    try
                    {
                        _sessionRepository.Add(hrmFileDto);
                        response = request.CreateResponse(HttpStatusCode.Created);
                    }
                    catch (Exception)
                    {
                        response = request.CreateResponse(HttpStatusCode.BadRequest);
                    }
                }

                return response;
            });
        }
        public void Add(HRMFileDto hrmFileDto)
        {
            var sections = new Sections();

            var splitSections = hrmFileDto.HRMFile.Split(new[] { "[Note]", "[ExtraData]", "[HRData]" }, StringSplitOptions.None);

            var sectionParams = splitSections[0];
            var sectionNote = splitSections[1];
            var sectionExtraData = splitSections[2];
            var sectionHRData = splitSections[3];

            // add header data
            using (var reader = new StringReader(sectionParams))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    if (line.Contains("Version")) { sections.Params.SoftwareVersion = Math.Round(Double.Parse(line.Split('=')[1]), 2, MidpointRounding.AwayFromZero); }
                    if (line.Contains("Monitor")) { sections.Params.MonitorVersion = int.Parse(line.Split('=')[1]); }
                    if (line.Contains("SMode")) { sections.Params.SMode = int.Parse(line.Split('=')[1]); }
                    if (line.Contains("StartTime")) { sections.Params.StartTime = line.Split('=')[1].FormatTime(); }
                    if (line.Contains("Length")) { sections.Params.Length = line.Split('=')[1].FormatTime(); }
                    if (line.Contains("Date")) { sections.Params.Date = line.Split('=')[1].FormatDate(); }
                    if (line.Contains("Interval")) { sections.Params.Interval = int.Parse(line.Split('=')[1]); }
                    if (line.Contains("Upper1")) { sections.Params.Upper1 = int.Parse(line.Split('=')[1]); }
                    if (line.Contains("Lower1")) { sections.Params.Lower1 = int.Parse(line.Split('=')[1]); }
                }
            }

            // create timespan from StartTime
            var startTime = new TimeSpan(0, sections.Params.StartTime.Hour, sections.Params.StartTime.Minute, sections.Params.StartTime.Second, sections.Params.StartTime.Millisecond);
            // add timespan to Date
            sections.Params.Date = sections.Params.Date.Date + startTime;

            // get unit from SMode - 8th digit
            var unit = int.Parse(sections.Params.SMode.ToString().ToCharArray()[7].ToString());

            var session = new Session()
            {
                Title = hrmFileDto.Title,
                Unit = unit,
                SoftwareVersion = sections.Params.SoftwareVersion,
                MonitorVersion = sections.Params.MonitorVersion,
                SMode = sections.Params.SMode,
                StartTime = sections.Params.StartTime,
                Length = sections.Params.Length,
                Date = sections.Params.Date,
                Interval = sections.Params.Interval,
                Upper1 = sections.Params.Upper1,
                Lower1 = sections.Params.Lower1,
                AthleteId = hrmFileDto.AthleteId
            };
       
            _context.Sessions.Add(session);

            // add body data
            var sessionDataList = new List<SessionData>();

            using (var reader = new StringReader(sectionHRData))
            {
                string line;
                var rowCount = 0;

                while ((line = reader.ReadLine()) != null)
                {
                    if (line == ""){ continue; } // line is empty on first read - continue and don't attempt to parse

                    string[] splitData = line.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); // split line by whitespace and tabs

                    var sessionData = new SessionData
                    {
                        Row = rowCount,
                        HeartRate = int.Parse(splitData[0]),
                        Speed = int.Parse(splitData[1]),
                        Cadence = int.Parse(splitData[2]),
                        Altitude = int.Parse(splitData[3]),
                        Power = int.Parse(splitData[4]),
                        SessionId = session.Id
                    };

                    sessionDataList.Add(sessionData); // add new session to list
                    rowCount++;
                }
            }

            sessionDataList.ForEach(s => _context.SessionData.Add(s)); // loop through each list item and save

            _context.SaveChanges();
        }