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;

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

        // GET: odata/FmsBudgetCodeClassEx
        [Queryable]
        public List<FmsBudgetDetail> GetFmsBudgetDetail()
        {
            var list = db.FmsBudgetDetail.Where(a => a.Depth == 2).ToList();
            
            var codeList = db.FmsBudgetCodeClass.ToList();
            foreach (var item in list)
            {
                item.RootBudgetName = codeList.Where(a => a.BudgetClassId == item.RootBudgetClassId).FirstOrDefault().Name;
                item.ParentBudgetName = codeList.Where(a => a.BudgetClassId == item.ParentBudgetClassId).FirstOrDefault().Name;
            }

            return list;
        }

        // POST: api/FmsBudgetDetail
        [ResponseType(typeof(void))]
        [ActionName("Save")]
        public IHttpActionResult PostFmsBudgetDetail(List<FmsBudgetDetail> budgetList)
        {
            Uri uri = Request.RequestUri;
            var uriQuery = HttpUtility.ParseQueryString(uri.Query);

            int siteId, year;
            if (int.TryParse(uriQuery.Get("SiteId"), out siteId) == false ||
                int.TryParse(uriQuery.Get("Year"), out year) == false)
            {
                return BadRequest("Not Found Parameters.");
            }

            try
            {
                // 예산편성 등록시 실적 코드도 미리 생성 
                foreach (var detailItem in budgetList)
                {

                    for (int i = 1; i <= 12; i++)
                    {
                        FmsBudgetDetailExecution execution = new FmsBudgetDetailExecution()
                        {
                            BudgetClassId = detailItem.BudgetClassId,
                            Month = i,
                            Year = detailItem.Year,
                            MonthlyExecution = 0,
                            YearlyExecution = 0,
                            MonthlyBudget = detailItem.MonthlyBudget,
                            YearlyBudget = detailItem.YearlyBudget,
                            RootBudgetClassId = detailItem.RootBudgetClassId,
                            ParentBudgetClassId = detailItem.ParentBudgetClassId,
                            SiteId = detailItem.SiteId,
                        };
                        detailItem.FmsBudgetDetailExecution.Add(execution);
                    }
                }


                FmsBudget budget = new FmsBudget() 
                {
                    SiteId = siteId,
                    Year = year,
                    FmsBudgetDetail = budgetList
                };

                db.FmsBudget.Add(budget);
                db.SaveChanges();
            }
            catch (Exception) { throw; }

            return StatusCode(HttpStatusCode.NoContent);
        }

        // POST: api/FmsBudgetDetail
        [ResponseType(typeof(void))]
        [ActionName("Update")]
        public IHttpActionResult PostFmsBudgetDetailUpdate(List<FmsBudgetDetail> budgetList)
        {
            Uri uri = Request.RequestUri;
            var uriQuery = HttpUtility.ParseQueryString(uri.Query);

            int siteId, year;
            if (int.TryParse(uriQuery.Get("SiteId"), out siteId) == false ||
                int.TryParse(uriQuery.Get("Year"), out year) == false)
            {
                return BadRequest("Not Found Parameters.");
            }

            try
            {
                //var query = from d in db.FmsBudgetDetail
                //            where d.SiteId == siteId && d.Year == year
                //            select d;

                //var qm = new QueryManager<FmsBudgetDetail>(db);
                //qm.DeleteAndInsert(db.FmsBudgetDetail, budgetList, query);
                
                foreach (var item in budgetList)
	            {
                    db.FmsBudgetDetail.Attach(item);
                    DbEntityEntry<FmsBudgetDetail> entry = db.Entry(item);
                    entry.State = System.Data.EntityState.Modified;

                    var updateED = (from us in db.FmsBudgetDetailExecution
                                    where us.SiteId == siteId && us.Year == item.Year && us.BudgetClassId == item.BudgetClassId && us.ParentBudgetClassId == item.ParentBudgetClassId
                        select us);

                    foreach (var ED in updateED)
                        ED.MonthlyBudget = item.MonthlyBudget;

	            }
                db.SaveChanges();

            }
            catch (Exception) { throw; }

            return StatusCode(HttpStatusCode.NoContent);
        }

        [ResponseType(typeof(void))]
        [ActionName("Delete")]
        public IHttpActionResult PostFmsBudgetDetail()
        {

            Uri uri = Request.RequestUri;
            var uriQuery = HttpUtility.ParseQueryString(uri.Query);

            int siteId, year;
            if (int.TryParse(uriQuery.Get("SiteId"), out siteId) == false ||
                int.TryParse(uriQuery.Get("Year"), out year) == false)
            {
                return BadRequest("Not Found Parameters.");
            }

            try
            {
                var budgetED = db.FmsBudgetDetailExecution
                    .Where(b => b.SiteId == siteId && b.Year == year);

                foreach (var deleteItem in budgetED)
                {
                    db.FmsBudgetDetailExecution.Remove(deleteItem);
                }

                var budgetE = db.FmsBudgetDetail
                    .Where(b => b.SiteId == siteId && b.Year == year);

                foreach (var deleteItem in budgetE)
                {
                    db.FmsBudgetDetail.Remove(deleteItem);
                }

                var budget = db.FmsBudget
                    .Where(b => b.SiteId == siteId && b.Year == year)
                    .FirstOrDefault();

                if (budget != null)
                {
                    db.FmsBudget.Remove(budget);
                }

                db.SaveChanges();
            }
            catch (Exception) { throw; }

            return StatusCode(HttpStatusCode.NoContent);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }


    }

}


namespace iBemsDataService.Model
{
    public partial class FmsBudgetDetail
    {
        public string RootBudgetName { get; set; }
        public string ParentBudgetName { get; set; }
    }
}