using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Http;
using System.Web.Http.Description;
using DevExpress.Office.Utils;
using iBemsDataService.Model;
using iBemsDataService.Util;
using System.Transactions;
using System.Diagnostics;

namespace iBemsDataService.Controllers
{
    public class BemsControlAHUTempConfigController : ApiController
    {
        private iBemsEntities db = new iBemsEntities();


        [ResponseType(typeof(void))]
        [ActionName("Insert")]
        public IHttpActionResult PostBemsControlAHUTempConfigInsert(ControlAHUTempConfig ControlAHUTempConfig)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            try
            {
                // 그룹을 추가하면서 메뉴들을 그룹에 맞는 권한 테이블로 모두 옮겨 놓는다.
                using (var transaction = new TransactionScope())
                {
                    var newPriceFormula = db.BemsControlAHUTempConfig.Add(new BemsControlAHUTempConfig
                    {
                        SiteId = ControlAHUTempConfig.SiteId,
                        FacilityTypeId = ControlAHUTempConfig.FacilityTypeId,
                        FacilityCode = ControlAHUTempConfig.FacilityCode,
                        MaxTemperature = Math.Round(ControlAHUTempConfig.MaxTemperature * 100) / 100.0,
                        MinTemperature = Math.Round(ControlAHUTempConfig.MinTemperature * 100) / 100.0,
                    });
                    db.SaveChanges();
                    transaction.Complete();
                }
            }
            catch (Exception)
            {
                throw;
            }
            return StatusCode(HttpStatusCode.NoContent);
        }

        [ResponseType(typeof(void))]
        [ActionName("InsertAll")]
        public IHttpActionResult PostBemsPriceFormulaInsertAll(List<ControlAHUTempConfig> ControlAHUTempConfig)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            try
            {
                using (var transaction = new TransactionScope())
                {
                    foreach (var m in ControlAHUTempConfig)
                    {
                        var foundQuery = db.BemsControlAHUTempConfig.Where(
                            x =>
                                x.SiteId == m.SiteId &&
                                x.FacilityTypeId == m.FacilityTypeId &&
                                x.FacilityCode == m.FacilityCode);

                        if (foundQuery.Any() == false)
                        {
                            var newM = db.BemsControlAHUTempConfig.Add(new BemsControlAHUTempConfig
                            {
                                SiteId = m.SiteId,
                                FacilityTypeId = m.FacilityTypeId,
                                FacilityCode = m.FacilityCode,
                                MaxTemperature = m.MaxTemperature,
                                MinTemperature = m.MinTemperature
                            });
                        }
                    }
                    db.SaveChanges();
                    transaction.Complete();
                }
            }
            catch (Exception)
            {
                throw;
            }
            return StatusCode(HttpStatusCode.NoContent);
        }

        [ResponseType(typeof(void))]
        [ActionName("DeleteAll")]
        public IHttpActionResult PostBemsPriceFormulaDeleteAll(ControlAHUTempConfig ControlAHUTempConfig)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            try
            {
                using (var transaction = new TransactionScope())
                {
                    var foundQuery = db.BemsControlAHUTempConfig.Where(
                        x =>
                            x.SiteId == ControlAHUTempConfig.SiteId &&
                            x.FacilityTypeId == ControlAHUTempConfig.FacilityTypeId &&
                            x.FacilityCode == ControlAHUTempConfig.FacilityCode);

                    //db.BemsPriceFormula.Remove(foundQuery.FirstOrDefault()); 한개만 지운다
                    new QueryManager<BemsControlAHUTempConfig>(db).Delete(db.BemsControlAHUTempConfig, foundQuery);
                    db.SaveChanges();

                    transaction.Complete();
                }
            }
            catch (Exception)
            {
                throw;
            }
            return StatusCode(HttpStatusCode.NoContent);
        }

        [ResponseType(typeof(void))]
        [ActionName("Update")]
        public IHttpActionResult PostBemsPriceFormulaUpdate(ControlAHUTempConfig ControlAHUTempConfig)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            try
            {
                using (var transaction = new TransactionScope())
                {
                    var foundQuery = db.BemsControlAHUTempConfig.Where(
                        x =>
                        x.SiteId == ControlAHUTempConfig.SiteId &&
                        x.FacilityTypeId == ControlAHUTempConfig.FacilityTypeId &&
                        x.FacilityCode == ControlAHUTempConfig.FacilityCode
                        );
                    new QueryManager<BemsControlAHUTempConfig>(db).Delete(db.BemsControlAHUTempConfig, foundQuery);

                    var newPriceFormula = db.BemsControlAHUTempConfig.Add(new BemsControlAHUTempConfig
                    {
                        SiteId = ControlAHUTempConfig.SiteId,
                        FacilityTypeId = ControlAHUTempConfig.FacilityTypeId,
                        FacilityCode = ControlAHUTempConfig.FacilityCode,
                        MaxTemperature = Math.Round(ControlAHUTempConfig.MaxTemperature * 100) / 100.0,
                        MinTemperature = Math.Round(ControlAHUTempConfig.MinTemperature * 100) / 100.0
                    });
                    db.SaveChanges();
                    transaction.Complete();
                }
            }
            catch (Exception)
            {
                throw;
            }
            return StatusCode(HttpStatusCode.NoContent);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
        public class ControlAHUTempConfig
        {
            public int SiteId { get; set; }
            public int FacilityTypeId { get; set; }
            public int FacilityCode { get; set; }
            public float MaxTemperature { get; set; }
            public float MinTemperature { get; set; }
        };
    }
}