using BookingWeb.DB;
using BookingWeb.DB.Model;
using BookingWeb.Models;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Filters;
using System.Web.Security;

namespace BookingWeb.Controllers
{
    public class BaseController : Controller
    {
        private BookingDB bookingDB = new BookingDB();

        private string _clintId;
        protected string ClientId
        {
            get
            {
                return _clintId;
            }
            private set { }
        }

        protected CurrentUser CurrentUser
        {
            get
            {
                if (Session["UserInfo"] != null)
                {
                    return (CurrentUser)Session["UserInfo"];
                }

                return null;
            }
        }

        protected CurrentCompany CurrentCompany
        {
            get
            {
                if (Session["CompanyInfo"] != null)
                {
                    return (CurrentCompany)Session["CompanyInfo"];
                }

                return null;
            }
        }

        protected void InitCurrentUser(SysUser user)
        {
            Session["UserInfo"] = user.AsCurrentUser();
        }

        protected void InitCurrentCompany(SysUser user)
        {
            Session["CompanyInfo"] = user.AsCurrentCompany();
        }

        protected override void OnAuthentication(AuthenticationContext filterContext)
        {
            base.OnAuthentication(filterContext);

            var client = filterContext.RouteData.Values["client"].ToString();
            var clientOjb = bookingDB.Clients.FirstOrDefault(c => c.GID == client);
            if (clientOjb == null)
            {
                filterContext.Result = new HttpNotFoundResult();
            }
            else
            {
                _clintId = client;

                object routeLang = filterContext.RouteData.Values["lang"];
                if (routeLang == null)
                {
                    routeLang = "cn";
                }

                if (routeLang.ToString() != "cn")
                {
                    ///从路由数据(url)里设置语言
                    var lang = filterContext.RouteData.Values["lang"].ToString();
                    Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(lang);
                }

                if (Session["UserInfo"] == null)
                {
                    if (!filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
                         && !filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))
                    {
                        filterContext.Result = new RedirectResult(Url.Action("login", "user", new { returnUrl = Request.Url }));
                    }
                }
            }
        }

        protected bool ValidData(out string message)
        {
            if (!ModelState.IsValid)
            {
                StringBuilder errStr = new StringBuilder();
                foreach (var sta in ModelState.Values)
                {
                    if (sta.Errors.Count > 0)
                    {
                        foreach (var err in sta.Errors)
                        {
                            errStr.AppendLine(err.ErrorMessage);
                        }
                    }
                }

                message = errStr.ToString();
                return false;
            }
            else
            {
                message = string.Empty;
                return true;
            }
        }
    }
}