public async Task <IActionResult> Save([FromBody] CalendarViewModel[] chain, bool isNew)
        {
            var result = new ValidationResult();

            if (chain.Length == 0 || string.IsNullOrEmpty(chain[0].Name))
            {
                result.Errors.Add(ValidationError.EmptyField(nameof(CalendarViewModel.Name)));
            }

            for (int i = 0; i < chain.Length; i++)
            {
                RemoveLastEmpty(chain[i].Days);
                RemoveLastEmpty(chain[i].Dates);

                var errors = new List <ValidationError>();
                chain[i].Validate(errors);
                errors.ForEach(x => x.SegmentIndex = i);
                result.Errors.AddRange(errors);
            }

            if (result.Success)
            {
                string name = chain[0].Name;

                ICalendar existing = null;

                if (isNew == false)
                {
                    existing = await Scheduler.GetCalendar(name);
                }

                ICalendar root = null, current = null;
                for (int i = 0; i < chain.Length; i++)
                {
                    ICalendar newCal = chain[i].Type.Equals("custom") ? existing : chain[i].BuildCalendar();

                    if (newCal == null)
                    {
                        break;
                    }

                    if (i == 0)
                    {
                        root = newCal;
                    }
                    else
                    {
                        current.CalendarBase = newCal;
                    }

                    current  = newCal;
                    existing = existing?.CalendarBase;
                }

                if (root == null)
                {
                    result.Errors.Add(new ValidationError()
                    {
                        Field = nameof(CalendarViewModel.Type), Reason = "Cannot create calendar.", SegmentIndex = 0
                    });
                }
                else
                {
                    await Scheduler.AddCalendar(name, root, replace : true, updateTriggers : true);
                }
            }

            return(Json(result));
        }