﻿using System.Linq;
using System.Web.Mvc;

namespace Umbraco.Web.Mvc
{
    /// <summary>
    /// When a ChildAction is executing and we want the ModelState from the Parent context to be merged in
    /// to help with validation, this filter can be used.
    /// </summary>
    /// <remarks>
    /// By default, this filter will only merge when an Http POST is detected but this can be modified in the ctor
    /// </remarks>
    public class MergeModelStateToChildActionAttribute : ActionFilterAttribute
    {
        private readonly string[] _verb;

        public MergeModelStateToChildActionAttribute()
            : this(HttpVerbs.Post)
        {

        }

        public MergeModelStateToChildActionAttribute(params HttpVerbs[] verb)
        {
            _verb = verb.Select(x => x.ToString().ToUpper()).ToArray();
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //check if the verb matches, if so merge the ModelState before the action is executed.
            if (_verb.Contains(filterContext.HttpContext.Request.HttpMethod))
            {
                if (filterContext.Controller.ControllerContext.IsChildAction)
                {
                    filterContext.Controller.ViewData.ModelState.Merge(
                        filterContext.Controller.ControllerContext.ParentActionViewContext.ViewData.ModelState);
                }
            }
            base.OnActionExecuting(filterContext);
        }
    }
}
