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 CmUserGroupController : ApiController
    {
        private iBemsEntities db = new iBemsEntities();

        const int PERMISSION_SEARCH                     = 1;
        const int PERMISSION_MODIFICATION               = 2;
        const int PERMISSION_DEPEND_BUSINESS_FIELD      = 4;

        const int PERMISSION_ALL                        = 7;   // 1: 조회, 2(10): 수정 , 4: 업무분야

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

            try
            {
                // 그룹을 추가하면서 메뉴들을 그룹에 맞는 권한 테이블로 모두 옮겨 놓는다.
                using( var transaction = new TransactionScope() )
                {
                    var newUserGroup = db.CmUserGroup.Add( new CmUserGroup
                    {
                        SiteId = userGroup.SiteId,
                        Name = userGroup.Name
                    });
                    db.SaveChanges();

                    foreach( var menu in userGroup.UserGroupPermissions )
                    {
                        //menu.SiteId = newUserGroup.SiteId;
                        //menu.UserGroupId = newUserGroup.UserGroupId;
                        //db.CmUserGroupPermission.Add( menu );
                        Trace.WriteLine( string.Format( "{0}-{1}" , newUserGroup.UserGroupId , menu.MenuId ) );
                        db.CmUserGroupPermission.Add( new CmUserGroupPermission
                        {
                            SiteId = newUserGroup.SiteId ,
                            UserGroupId = newUserGroup.UserGroupId ,
                            MenuId = menu.MenuId ,
                            MenuPermission = PERMISSION_ALL
                        } );
                        db.SaveChanges();
                    }

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

        [ResponseType( typeof( void ) )]
        [ActionName( "UpdatePermission" )]
        public IHttpActionResult PostCmUserGroup( List<CmUserGroupPermission> userGroupPermissions )
        {
            if( !ModelState.IsValid )
            {
                return BadRequest( ModelState );
            }

            try
            {
                using( var transaction = new TransactionScope() )
                {
                    foreach( var permission in userGroupPermissions )
                    {
                        var foundQuery = db.CmUserGroupPermission.Where(
                            x =>
                                x.SiteId == permission.SiteId &&
                                x.UserGroupId == permission.UserGroupId &&
                                x.MenuId == permission.MenuId );

                        if( foundQuery.Any() == false )
                            continue;

                        var found = foundQuery.First();
                        found.MenuPermission = permission.MenuPermission;
                    }

                    db.SaveChanges();

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

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

        private bool CmUserGroupExists( int id )
        {
            return db.CmUserGroup.Count( e => e.SiteId == id ) > 0;
        }

        public class UserGroup
        {
            public int SiteId { get; set; }
            public int UserGroupId { get; set; }
            public string Name { get; set; }

            public List<CmUserGroupPermission> UserGroupPermissions { get; set; }
        };

    }

}