/// <summary>
        /// Retrieves the line item that
        /// </summary>
        /// <param name="lineId">id of line to return</param>
        /// <returns></returns>
        public ItemizedIncidentLine GetItemizedLineById(int lineId)
        {
            ItemizedIncidentLine line = null;
            const string         sql  = "SELECT * FROM incident_itemizated WHERE id = @line_id;";

            using (SqlConnection conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(sql, conn);
                cmd.Parameters.AddWithValue("@line_id", lineId);
                var reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    line = GetItemizedIncidentLineFromReader(reader);
                }
            }

            if (line == null)
            {
                throw new Exception("Repair line does not exist.");
            }

            return(line);
        }
        public IActionResult DeclineLineItem([FromBody] ApproveRepairViewModel model)
        {
            IActionResult result = Unauthorized();

            try
            {
                ItemizedIncidentLine line = _db.GetItemizedLineById(model.LineId);

                if (!line.Approved)
                {
                    _db.DeclineLineItem(model.LineId);
                    result = Ok();
                }
                else
                {
                    result = BadRequest(new { Message = "Line approved already, can't decline now." });
                }
            }
            catch
            {
                result = BadRequest(new { Message = "Declining repair line failed." });
            }

            return(result);
        }
        /// <summary>
        /// Saves reader data to an itemized incident line item.
        /// </summary>
        /// <param name="reader">Reader line with data</param>
        /// <returns>New ItemizedIncidentLine item</returns>
        private ItemizedIncidentLine GetItemizedIncidentLineFromReader(SqlDataReader reader)
        {
            ItemizedIncidentLine itemizedIncidentLine = new ItemizedIncidentLine();

            itemizedIncidentLine.Id          = Convert.ToInt32(reader["id"]);
            itemizedIncidentLine.IncidentId  = Convert.ToInt32(reader["incident_id"]);
            itemizedIncidentLine.Description = Convert.ToString(reader["description"]);
            itemizedIncidentLine.Cost        = Convert.ToDecimal(reader["cost"]);
            itemizedIncidentLine.TimeHours   = Convert.ToInt32(reader["time_hours"]);
            itemizedIncidentLine.Approved    = Convert.ToBoolean(reader["approved"]);
            itemizedIncidentLine.Declined    = Convert.ToBoolean(reader["declined"]);

            return(itemizedIncidentLine);
        }
        public IActionResult AddNewItemizedLine([FromBody] RepairLineViewModel model)
        {
            IActionResult result = Unauthorized();

            try
            {
                if (ModelState.IsValid)
                {
                    ItemizedIncidentLine itemizedIncidentLine = new ItemizedIncidentLine
                    {
                        Cost        = model.Cost,
                        Description = model.Description,
                        TimeHours   = model.TimeHours,
                        IncidentId  = model.IncidentId,
                        Approved    = false,
                        Declined    = false
                    };

                    //Check if incidents exists
                    Incident existingIncident = _db.GetIncidentById(model.IncidentId);

                    //if vehicle does exist, add incident to vehicle
                    if (existingIncident != null)
                    {
                        itemizedIncidentLine.IncidentId = existingIncident.Id;
                        itemizedIncidentLine.Id         = _db.AddItemizedLine(itemizedIncidentLine);
                        result = Ok(itemizedIncidentLine);
                    }
                }
                else
                {
                    result = BadRequest(new { Message = "Incident does not Exist." });
                }
            }
            catch
            {
                result = BadRequest(new { Message = "Adding new repair line failed." });
            }

            return(result);
        }
        /// <summary>
        /// Adds an incident by line item to the database.
        /// </summary>
        /// <param name="model">New itemized line to add</param>
        /// <returns>Id of the newly generated incident by line item</returns>
        public int AddItemizedLine(ItemizedIncidentLine model)
        {
            using (SqlConnection conn = new SqlConnection(_connectionString))
            {
                const string sql = "INSERT [incident_itemizated] (incident_id, description, cost, time_hours, approved, declined) " +
                                   "VALUES(@incident_id, @description, @cost, @time_hours, @approved, @declined)";

                conn.Open();

                SqlCommand cmd = new SqlCommand(sql + _getLastIdSQL, conn);
                cmd.Parameters.AddWithValue("@incident_id", model.IncidentId);
                cmd.Parameters.AddWithValue("@description", model.Description);
                cmd.Parameters.AddWithValue("@cost", model.Cost);
                cmd.Parameters.AddWithValue("@time_hours", model.TimeHours);
                cmd.Parameters.AddWithValue("@approved", model.Approved);
                cmd.Parameters.AddWithValue("@declined", model.Declined);
                model.Id = (int)cmd.ExecuteScalar();
            }

            return(model.Id);
        }
        /// <summary>
        /// Edits fields in the line item then sets line item to unapproved.
        /// </summary>
        /// <param name="itemLineId"></param>
        /// <returns>Whether it succeded or not</returns>
        public int EditLineItem(ItemizedIncidentLine model)
        {
            //pass in new view model and keep the same line id
            const string sql = "UPDATE incident_itemizated " +
                               "SET description = @description, cost = @cost, time_hours = @time_hours, approved = null, declined = null" +
                               "WHERE incident_id = model.IncidentId ";

            using (SqlConnection conn = new SqlConnection(_connectionString))
            {
                conn.Open();


                SqlCommand cmd = new SqlCommand(sql + _getLastIdSQL, conn);
                cmd.Parameters.AddWithValue("@incident_id", model.IncidentId);
                cmd.Parameters.AddWithValue("@description", model.Description);
                cmd.Parameters.AddWithValue("@cost", model.Cost);
                cmd.Parameters.AddWithValue("@time_hours", model.TimeHours);
                model.Id = (int)cmd.ExecuteScalar();

                return(model.Id);
            }
        }
        public IActionResult EditLineItem(UpdateRepairItemViewModel model)
        {
            IActionResult result = Unauthorized();

            try
            {
                ItemizedIncidentLine line = _db.GetItemizedLineById(model.LineId);


                line.Description = model.Description;
                line.Cost        = model.Cost;
                line.TimeHours   = model.TimeHours;


                _db.EditLineItem(line);
            }
            catch
            {
                result = BadRequest(new { Message = "Unable to update Incident Line." });
            }

            return(result);
        }