using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using Microsoft.AspNet.Identity;
using Weee.DAL;
using Weee.Filter;
using Weee.Models;
using System.Data.Entity;
using Weee.Service;
using CScommon;
using Qcarbon.Interfaces.adminCheck;
using NLog;
using System.Web.Http.Controllers;
using Qcarbon.Database.adminCheck;
using Qcarbon.ViewModels.admin;

namespace Weee.Controllers
{
    [Authorize(Roles = ProgramConstants.normalcompany)]
    public class UserController : ApiController
    {
        private readonly WeeeDataContext db;
        //private readonly UserManager<User> manager;
        protected IadminCheckService _adminCheckService;
        protected IcompanyAdminCheckService _companyAdminCheckService;
        protected Logger log;
        private UserService userService;

        public UserController(WeeeDataContext d, UserManager<User> m)
        {
            db = d;
            //manager = m;
            userService = new UserService(d, m);
        }
        protected override void Initialize(HttpControllerContext controllerContext)
        {
            base.Initialize(controllerContext);
            var userid = User.Identity.GetUserId();
            _adminCheckService = new adminCheckService(db, userid);
            _companyAdminCheckService = new companyAdminCheckService(db, userid);
            log = NLog.LogManager.GetCurrentClassLogger();
        }

        [Route("api/User/GetByMyCompany")]
        [HttpGet]
        public IEnumerable<object> GetByMyCompany()
        {
            var currentId = User.Identity.GetUserId();
            var ret= userService.GetByMyCompany(currentId);
            return ret;
            //var currentCompanyId = db.Users.Where(x => x.Id == currentId).Select(x => x.CompanyID).Single();

            //return db.Users
            //         .Where(x => !x.IsSystemAdmin && !x.IsCompanyAdmin && x.CompanyID == currentCompanyId)
            //         .ToList();
        }

        [Route("api/User/isCompanyAdmin")]
        [HttpGet]
        public bool isCompanyAdmin()
        {
            var currentId = User.Identity.GetUserId();
            var ret = userService.isCompanyAdmin(currentId);
            return ret;
        }

        [Route("api/User/GetByUid/{uid}")]
        [HttpGet]
        public object GetByUid(string uid)
        {
            var currentId = User.Identity.GetUserId();
            return userService.GetByUid(uid, currentId);

            //var currentCompanyId = db.Users.Where(x => x.Id == currentId).Select(x => x.CompanyID).Single();

            //return db.Users
            //         .Where(x => !x.IsSystemAdmin && !x.IsCompanyAdmin && x.CompanyID == currentCompanyId)
            //         .Where(x => x.Id == uid)
            //         .FirstOrDefault();
        }
        /// <summary>
        /// 由angularJS呼叫過來刪除使用者之處
        /// </summary>
        /// <param name="toBeSave"></param>
        /// <returns></returns>
        [Route("api/User/Delete/{id?}")]
        [HttpPost]
        public int Delete(User toBeSave)
        {
            // 研究使用者如何建立
            var currentId = User.Identity.GetUserId();
            return userService.Delete(toBeSave, currentId);
        }
        /// <summary>
        /// 由angularJS呼叫過來新建使用者之處
        /// </summary>
        /// <param name="toBeSave"></param>
        /// <returns></returns>
        [Route("api/User/Save/{id?}")]
        [HttpPost]
        public int Save(User toBeSave)
        {
            // 研究使用者如何建立
            var currentId = User.Identity.GetUserId();
            if (!_adminCheckService.adminCheckPass())
            {
                AdminAccess aa = _adminCheckService.getAdminAccess();
                int lcaUserQuantity =
                    _adminCheckService.getLcaUserQuantity();
                if (lcaUserQuantity >= aa.lcaUserLimit
                    && aa.lcaUserLimit != -1)
                    throw new Exception(
                        $"盤查員帳號數({lcaUserQuantity})已達或超過全站限制" +
                        $"({aa.lcaUserLimit}),請系統管理員更新金鑰限制重新匯入");
                var userid = User.Identity.GetUserId();
                companyAdminAccessVM uaaVM = _companyAdminCheckService
                    .getCompanyAdminAccessVM(
                        _companyAdminCheckService.userId2companyID(userid));
                int lcaUserQuantityByUserId = _companyAdminCheckService.getLcaUserQuantityByUserId(userid);
                if (lcaUserQuantityByUserId >= uaaVM.lcaUserLimit
                    && uaaVM.lcaUserLimit!=-1)
                    throw new Exception(
                        $"盤查員帳號數({lcaUserQuantityByUserId})已達或超過公司限制" +
                        $"({uaaVM.lcaUserLimit}),請公司管理員更新限制重新嘗試");
            }
            toBeSave.CreatedTime= DateTime.Now;
            int ret = userService.Save(toBeSave, currentId);
            return ret;
            //var currentCompanyId = db.Users.Where(x => x.Id == currentId).Select(x => x.CompanyID).Single();
            //toBeSave.CompanyID = currentCompanyId;
            //toBeSave.IsCompanyAdmin = false;
            //toBeSave.IsSystemAdmin = false;

            //var user = manager.FindById(toBeSave.Id);
            //if (user == null)
            //{
            //    var result = manager.Create(toBeSave, toBeSave.DefaultPassword);
            //    if (!result.Succeeded)
            //        return -1;
            //    manager.AddToRole(toBeSave.Id, ProgramConstants.normalcompany);
            //}
            //else
            //{
            //    user.Name = toBeSave.Name;
            //    user.Job = toBeSave.Job;
            //    user.Email = toBeSave.Email;
            //    user.PhoneNumber = toBeSave.PhoneNumber;
            //    user.MobileNumber = toBeSave.MobileNumber;
            //    db.SaveChanges();
            //}
            
            //return 0;
        }

    }
}