using System;
using System.Linq.Expressions;
using System.Text;
using System.Web.Mvc;
using Kreta.Framework;

namespace Kreta.Web.Helpers
{
    public static class RangeDatePickerExtensions
    {
        public static MvcHtmlString KretaRangeDatePicker<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> fromExpression, Expression<Func<TModel, TValue>> toExpression, string title = "")
        {
            var fromFieldName = ExpressionHelper.GetExpressionText(fromExpression);
            var fromFieldId = fromFieldName.Replace(".", "_");
            var fromMetadata = ModelMetadata.FromLambdaExpression(fromExpression, helper.ViewData);
            var fromDisplayName = fromMetadata.DisplayName;

            var toFieldName = ExpressionHelper.GetExpressionText(toExpression);
            var toFieldId = toFieldName.Replace(".", "_");
            var toMetadata = ModelMetadata.FromLambdaExpression(toExpression, helper.ViewData);
            var toDisplayName = toMetadata.DisplayName;

            StringBuilder sb = new StringBuilder();

            string fromDate = "<input id='" + fromFieldId + "' name='" + fromFieldName + "' />";
            string toDate = "<input id='" + toFieldId + "' name='" + toFieldName + "' />";

            string scriptTag = @"<script>
                                    $(document).ready(function () {
                                        function start" + fromFieldId + @"Change() {
                                            var startDate = start" + fromFieldId + @".value(), endDate = end" + toFieldId + @".value();
                                            if (typeof startDate !== 'undefined' && typeof endDate !== 'undefined'){
                                                if (startDate) {
                                                    startDate = new Date(startDate);
                                                    startDate.setDate(startDate.getDate());
                                                    end" + toFieldId + @".min(startDate);
                                                } else if (endDate) {
                                                    start" + fromFieldId + @".max(new Date(endDate));
                                                } else {
                                                    endDate = new Date();
                                                    start" + fromFieldId + @".max(endDate);
                                                    end" + toFieldId + @".min(endDate);
                                                }
                                            }
                                        }

                                        function end" + toFieldId + @"Change() {
                                            var endDate = end" + toFieldId + @".value(), startDate = start" + fromFieldId + @".value();

                                            if (endDate) {
                                                endDate = new Date(endDate);
                                                endDate.setDate(endDate.getDate());
                                                start" + fromFieldId + @".max(endDate);
                                            } else if (startDate) {
                                                end" + toFieldId + @".min(new Date(startDate));
                                            } else {
                                                endDate = new Date();
                                                start" + fromFieldId + @".max(endDate);
                                                end" + toFieldId + @".min(endDate);
                                            }
                                        }

                                        var start" + fromFieldId + @" = $('#" + fromFieldId + @"').kendoDatePicker({
                                                        change: start" + fromFieldId + @"Change,
                                                        'format': 'yyyy. MM. dd.'
                                                    }).data('kendoDatePicker');

                                        var end" + toFieldId + @" = $('#" + toFieldId + @"').kendoDatePicker({
                                                        change: end" + toFieldId + @"Change,
                                                        'format': 'yyyy. MM. dd.'
                                                    }).data('kendoDatePicker');

                                        start" + fromFieldId + @".max(end" + toFieldId + @".value());
                                        end" + toFieldId + @".min(start" + fromFieldId + @".value());

                                        $('#" + fromFieldId + @"').parent().parent().after('" + string.Format("<span class=\"searchPanelLabel\">{0}</span>", StringResourcesUtil.GetString(3080)) + @"');
                                        $('#" + toFieldId + @"').parent().parent().after('" + string.Format("<span class=\"searchPanelLabel\">{0}</span>", StringResourcesUtil.GetString(3081)) + @"');
                                    });
                                </script>";

            string displayName = "";
            if (!string.IsNullOrWhiteSpace(title))
            { displayName = title; }
            else
            {
                if (!string.IsNullOrWhiteSpace(fromDisplayName))
                { displayName = fromDisplayName; }
                else
                {
                    if (!string.IsNullOrWhiteSpace(toDisplayName))
                    { displayName = toDisplayName; }
                }
            }

            sb.Append("<div class=\"searchPanelRow\">");
            sb.Append("<div class=\"searchPanelRowTitle\">");
            sb.Append("<label class=\"searchPanelLabel\" for=\"").Append("aaa").Append("\">").Append(displayName).Append("</label>");
            sb.Append("</div>");
            sb.Append("<div class=\"searchPanelRowValue\">");
            sb.Append(fromDate).Append("&nbsp;").Append(toDate).Append(scriptTag);
            sb.Append("</div>");
            sb.Append("</div>");

            return new MvcHtmlString(sb.ToString());
        }

        public static MvcHtmlString KretaRangeDatePickerSideBar<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> fromExpression, Expression<Func<TModel, TValue>> toExpression, string title = "")
        {
            var fromFieldName = ExpressionHelper.GetExpressionText(fromExpression);
            var fromFieldId = fromFieldName.Replace(".", "_");
            var fromMetadata = ModelMetadata.FromLambdaExpression(fromExpression, helper.ViewData);
            var fromDisplayName = fromMetadata.DisplayName;
            var fromValue = fromMetadata.Model;

            var toFieldName = ExpressionHelper.GetExpressionText(toExpression);
            var toFieldId = toFieldName.Replace(".", "_");
            var toMetadata = ModelMetadata.FromLambdaExpression(toExpression, helper.ViewData);
            var toDisplayName = toMetadata.DisplayName;
            var toValue = toMetadata.Model;

            StringBuilder sb = new StringBuilder();

            string fromDate = "<input id='" + fromFieldId + "' name='" + fromFieldName + "' value='" + fromValue + "' />";
            string toDate = "<input id='" + toFieldId + "' name='" + toFieldName + "' value='" + toValue + "' />";

            string scriptTag = @"<script>
                                    $(document).ready(function () {
                                        function start" + fromFieldId + @"Change() {
                                            var startDate = start" + fromFieldId + @".value(), endDate = end" + toFieldId + @".value();

                                            if (startDate) {
                                                startDate = new Date(startDate);
                                                startDate.setDate(startDate.getDate());
                                                end" + toFieldId + @".min(startDate);
                                            } else if (endDate) {
                                                start" + fromFieldId + @".max(new Date(endDate));
                                                end" + toFieldId + @".min(new Date(1900, 0, 1));
                                            } else {
                                                endDate = new Date();
                                                start" + fromFieldId + @".max(endDate);
                                                end" + toFieldId + @".min(endDate);
                                            }
                                        }

                                        function end" + toFieldId + @"Change() {
                                            var endDate = end" + toFieldId + @".value(), startDate = start" + fromFieldId + @".value();

                                            if (endDate) {
                                                endDate = new Date(endDate);
                                                endDate.setDate(endDate.getDate());
                                                start" + fromFieldId + @".max(endDate);
                                            } else if (startDate) {
                                                end" + toFieldId + @".min(new Date(startDate));
                                                start" + fromFieldId + @".max(new Date(2099, 11, 31));
                                            } else {
                                                endDate = new Date();
                                                start" + fromFieldId + @".max(endDate);
                                                end" + toFieldId + @".min(endDate);
                                            }
                                        }

                                        function open" + fromFieldId + @"Change() {
                                            var endDate = Date.parse($('#" + toFieldId + @"').val());
                                                if(isNaN(endDate)){
                                                start" + fromFieldId + @".max(new Date(2099, 11, 31));
                                            }
                                        }

                                        function open" + toFieldId + @"Change() {
                                            var startDate = Date.parse( $('#" + fromFieldId + @"').val());
                                            if(isNaN(startDate)){
                                                end" + toFieldId + @".min(new Date(1900, 0, 1));
                                            }
                                        }

                                        var start" + fromFieldId + @" = $('#" + fromFieldId + @"').kendoDatePicker({
                                                        change: start" + fromFieldId + @"Change,
                                                        open: open" + fromFieldId + @"Change,
                                                        'format': 'yyyy. MM. dd.'
                                                    }).data('kendoDatePicker');

                                        var end" + toFieldId + @" = $('#" + toFieldId + @"').kendoDatePicker({
                                                        change: end" + toFieldId + @"Change,
                                                        open: open" + toFieldId + @"Change,
                                                        'format': 'yyyy. MM. dd.'
                                                    }).data('kendoDatePicker');

                                        start" + fromFieldId + @".max(end" + toFieldId + @".value());
                                        end" + toFieldId + @".min(start" + fromFieldId + @".value());

                                        $('#" + fromFieldId + @"').parent().parent().after('" + string.Format("<span class=\"searchPanelLabel\">{0}</span>", StringResourcesUtil.GetString(3080)) + @"');
                                        $('#" + toFieldId + @"').parent().parent().after('" + string.Format("<span class=\"searchPanelLabel\">{0}</span>", StringResourcesUtil.GetString(3081)) + @"');
                                    });
                                </script>";

            string displayName = "";
            if (!string.IsNullOrWhiteSpace(title))
            { displayName = title; }
            else
            {
                if (!string.IsNullOrWhiteSpace(fromDisplayName))
                { displayName = fromDisplayName; }
                else
                {
                    if (!string.IsNullOrWhiteSpace(toDisplayName))
                    { displayName = toDisplayName; }
                }
            }

            sb.Append("<div class=\"searchPanelRow\">");
            sb.Append("<div class=\"searchPanelRowTitle\">");
            sb.Append("<label class=\"searchPanelLabel\" for=\"").Append("aaa").Append("\">").Append(displayName).Append("</label>");
            sb.Append("</div>");
            sb.Append("<div class=\"searchPanelRowValue\">");
            sb.Append(fromDate).Append("<br />").Append(toDate).Append(scriptTag);
            sb.Append("</div>");
            sb.Append("</div>");

            sb.Append("<script>$(\"#").Append(fromFieldId).Append("\").kendoMaskedDatePicker();$(\"#").Append(toFieldName).Append("\").kendoMaskedDatePicker();");
            sb.Append("$(\"#").Append(fromFieldId).Append("\").change(function() {{ KretaDateTimeHelper.validateDate($(this)); }});");
            sb.Append("$(\"#").Append(toFieldId).Append("\").change(function() {{ KretaDateTimeHelper.validateDate($(this)); }});");
            sb.Append("</script>");

            return new MvcHtmlString(sb.ToString());
        }
    }
}