using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using System.Web.Http.Description;
using System.Web.Http.OData;
using iBemsDataService;
using iBemsDataService.Model;

namespace iBemsDataService.Controllers
{


    public class FmsBudgetCodeClassController : ODataController
    {
        private iBemsEntities db = new iBemsEntities();

        // GET: odata/FmsBudgetCodeClassEx
        [Queryable]
        public List<FmsBudgetCodeClass> GetFmsBudgetCodeClass()
        {
            // 2019.07.12
            Uri uri = Request.RequestUri;
            var uriQuery = HttpUtility.ParseQueryString(uri.Query);
            int siteId;
            if (int.TryParse(uriQuery.Get("SiteId"), out siteId) == false)
            {
                throw new Exception("Not Found Parameters.");
            }
            var list = db.FmsBudgetCodeClass.Where(a =>
                a.SiteId == siteId &&
                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;

        }


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





    public class FmsBudgetCodeClass2Controller : ApiController
    {
        private iBemsEntities db2 = new iBemsEntities();

        [ResponseType(typeof(void))]
        [ActionName("Insert")]
        public IHttpActionResult PostFmsBudgetCodeClass2Insert(FmsBudgetCodeClass budgetCode)
        {
            if (budgetCode == null) return BadRequest("Not Found Parameters.");
            if (budgetCode.SiteId == 0) return BadRequest("Not Found Parameters.");

            List<FmsBudgetCodeClass> codeList = null;


            IEnumerable<FmsBudgetCodeClass> newKeyData = (from data in db2.FmsBudgetCodeClass
                                                          where data.SiteId == budgetCode.SiteId && (data.ParentBudgetClassId == null || (data.ParentBudgetClassId == budgetCode.ParentBudgetClassId)) &&
                                                                data.Depth == budgetCode.Depth && (data.Name == budgetCode.Name || data.Abbreviation == budgetCode.Abbreviation)
                                                            select data).Take(1);
            if (newKeyData.Count() > 0)
            {
                return BadRequest("중복된 이름이나 별명이 이미 존재 합니다!");
            }

            try
            {

                if (budgetCode.Depth == 0)
                {
                    codeList = db2.FmsBudgetCodeClass
                           .Where(a => a.Depth == 0).ToList();

                    var lastCode = codeList.OrderByDescending(a => a.BudgetSeq).FirstOrDefault();
                    int lastBudgetSeq = int.Parse(lastCode.BudgetSeq.Substring(lastCode.BudgetSeq.Length - 2));

                    budgetCode.BudgetSeq = MakeNumToString(lastBudgetSeq +1, 2);
                    budgetCode.IsUse = true;
                    

                }
                else if (budgetCode.Depth == 1)
                {
                    codeList = db2.FmsBudgetCodeClass
                            .Where(a => a.Depth == 1 && a.ParentBudgetClassId == budgetCode.ParentBudgetClassId).ToList();

                    var lastCode = codeList.OrderByDescending(a => a.BudgetSeq).FirstOrDefault();

                    string middleBudgetSeq = string.Empty;
                    int lastBudgetSeq = 0;

                    if (lastCode != null)
                    {
                        middleBudgetSeq = lastCode.BudgetSeq.Substring(0, lastCode.BudgetSeq.Length - 2);
                        lastBudgetSeq = int.Parse(lastCode.BudgetSeq.Substring(lastCode.BudgetSeq.Length - 2));
                        budgetCode.RootBudgetClassId = lastCode.RootBudgetClassId;
                    }
                    else
                    {
                        var parentCode = db2.FmsBudgetCodeClass.Where(a => a.BudgetClassId == budgetCode.ParentBudgetClassId).FirstOrDefault();
                        if (parentCode == null) return BadRequest("Not Found Parameters.");
                        middleBudgetSeq = parentCode.BudgetSeq;
                        lastBudgetSeq = 0;
                        budgetCode.RootBudgetClassId = parentCode.BudgetClassId;
                    }
                    
                    budgetCode.BudgetSeq = middleBudgetSeq + MakeNumToString(lastBudgetSeq + 1, 2);
                    budgetCode.IsUse = true;
                    

                }
                else if (budgetCode.Depth == 2)
                {
                    codeList = db2.FmsBudgetCodeClass
                            .Where(a => a.Depth == 2 && a.ParentBudgetClassId == budgetCode.ParentBudgetClassId).ToList();

                    var lastCode = codeList.OrderByDescending(a => a.BudgetSeq).FirstOrDefault();

                    string middleBudgetSeq = string.Empty;
                    int lastBudgetSeq = 0;

                    if (lastCode != null)
                    {
                        middleBudgetSeq = lastCode.BudgetSeq.Substring(0, lastCode.BudgetSeq.Length - 2);
                        lastBudgetSeq = int.Parse(lastCode.BudgetSeq.Substring(lastCode.BudgetSeq.Length - 2));
                        budgetCode.RootBudgetClassId = lastCode.RootBudgetClassId;
                    }
                    else
                    {
                        var parentCode = db2.FmsBudgetCodeClass.Where(a => a.BudgetClassId == budgetCode.ParentBudgetClassId).FirstOrDefault();
                        if (parentCode == null) return BadRequest("Not Found Parameters.");

                        middleBudgetSeq = parentCode.BudgetSeq;
                        lastBudgetSeq = 0;
                        budgetCode.RootBudgetClassId = parentCode.RootBudgetClassId;
                    }

                    budgetCode.BudgetSeq = middleBudgetSeq + MakeNumToString(lastBudgetSeq + 1, 2);
                    budgetCode.IsUse = true;
                    
                }
                else
                {
                    return BadRequest("Not Found Parameters."); 
                }

                db2.FmsBudgetCodeClass.Add(budgetCode);
                db2.SaveChanges();
            }
            catch (Exception) { throw;
                //return BadRequest("중복된 이름이나 별명이 이미 존재 합니다!");
            }

            return StatusCode(HttpStatusCode.NoContent);
        }

        [ResponseType(typeof(void))]
        [ActionName("Update")]
        public IHttpActionResult PostFmsBudgetCodeClass2Update(FmsBudgetCodeClass budgetCode)
        {

            if (budgetCode == null) return BadRequest("Not Found Parameters.");
            if (budgetCode.SiteId == 0) return BadRequest("Not Found Parameters.");
            if (budgetCode.BudgetClassId == 0) return BadRequest("Not Found Parameters.");

            IEnumerable<FmsBudgetCodeClass> newKeyData = (from data in db2.FmsBudgetCodeClass
                                                          where data.SiteId == budgetCode.SiteId && (data.ParentBudgetClassId == null || (data.ParentBudgetClassId == budgetCode.ParentBudgetClassId)) &&
                                                                data.Depth == budgetCode.Depth && (data.Name == budgetCode.Name || data.Abbreviation == budgetCode.Abbreviation)
                                                          select data).Take(1);
            if (newKeyData.Count() > 1)
            {
                return BadRequest("중복된 이름이나 별명이 이미 존재 합니다!");
            }

            try
            {
                var codeClass = db2.FmsBudgetCodeClass
                    .Where(a => a.BudgetClassId == budgetCode.BudgetClassId)
                    .FirstOrDefault();

                if (codeClass == null) return BadRequest("Not Found Parameters.");

                codeClass.Name = budgetCode.Name;
                codeClass.Abbreviation = budgetCode.Abbreviation;
                //2016 02 03 추가 hcLee
                codeClass.IsUse = budgetCode.IsUse;

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

            return StatusCode(HttpStatusCode.NoContent);
        }

        [ResponseType(typeof(void))]
        [ActionName("Delete")]
        public IHttpActionResult PostFmsBudgetCodeClass2Delete(FmsBudgetCodeClass budgetCode)
        {
            if (budgetCode == null) return BadRequest("Not Found Parameters.");
            if (budgetCode.SiteId == 0) return BadRequest("Not Found Parameters.");
            if (budgetCode.BudgetClassId == 0) return BadRequest("Not Found Parameters.");

            try
            {
                var codeClass = db2.FmsBudgetCodeClass
                   .Where(a => a.BudgetClassId == budgetCode.BudgetClassId)
                   .FirstOrDefault();

                if (codeClass == null) return BadRequest("Not Found Parameters.");

                db2.FmsBudgetCodeClass.Remove(codeClass);
                db2.SaveChanges();
            }
            catch (Exception) { throw; }

            return StatusCode(HttpStatusCode.NoContent);
        }

        private string MakeNumToString(int target, int length)
        {
            string targetValue =  target.ToString();

            if (targetValue.Length >= length) return targetValue;

            for (int i = 1; i < length; i++)
            {
                targetValue = "0" + targetValue;
            }

            return targetValue;
        }
    }
}
namespace iBemsDataService.Model
{
    public partial class FmsBudgetCodeClass
    {
        public string RootBudgetName { get; set; }
        public string ParentBudgetName { get; set; }
    }
}