// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;

namespace FormatterWebSite.Controllers
{
    public class TopLevelValidationController : Controller
    {
        [BindProperty] public int OptionalProp { get; set; }
        [BindProperty, Required] public int RequiredProp { get; set; }
        [BindProperty, BindRequired] public int BindRequiredProp { get; set; }
        [BindProperty, Required, BindRequired] public int RequiredAndBindRequiredProp { get; set; }
        [BindProperty, StringLength(5)] public string OptionalStringLengthProp { get; set; }
        [BindProperty, Range(1, 100), DisplayName("Some Display Name For Prop")] public int OptionalRangeDisplayNameProp { get; set; }

        // Despite the Required/BindRequired attributes, these properties won't be validated
        // because they aren't [BindProperty] properties (hence aren't involved in binding).
        [Required] public int UnboundRequiredProp { get; set; }
        [BindRequired] public int UnboundBindRequiredProp { get; set; }

        // The [BindNever] overrides [BindProperty], meaning [Required] will not apply
        // (nor will any incoming value be used)
        [BindProperty, BindNever, Required] public string BindNeverRequiredProp { get; set; }

        public IActionResult Index(
            int optionalParam,
            [Required] int requiredParam,
            [BindRequired] int bindRequiredParam,
            [Required, BindRequired] int requiredAndBindRequiredParam,
            [StringLength(5)] string optionalStringLengthParam,
            [Range(1, 100), Display(Name = "Some Display Name For Param")] int optionalRangeDisplayNameParam)
        {
            if (ModelState.IsValid)
            {
                return Content($@"
                    [{ nameof(OptionalProp) }:{ OptionalProp }]
                    [{ nameof(RequiredProp) }:{ RequiredProp }]
                    [{ nameof(BindRequiredProp) }:{ BindRequiredProp }]
                    [{ nameof(RequiredAndBindRequiredProp) }:{ RequiredAndBindRequiredProp }]
                    [{ nameof(OptionalStringLengthProp) }:{ OptionalStringLengthProp }]
                    [{ nameof(OptionalRangeDisplayNameProp) }:{ OptionalRangeDisplayNameProp }]
                    [{ nameof(UnboundRequiredProp) }:{ UnboundRequiredProp }]
                    [{ nameof(UnboundBindRequiredProp) }:{ UnboundBindRequiredProp }]
                    [{ nameof(BindNeverRequiredProp) }:{ BindNeverRequiredProp }]
                    [{ nameof(optionalParam) }:{ optionalParam }]
                    [{ nameof(requiredParam) }:{ requiredParam }]
                    [{ nameof(bindRequiredParam) }:{ bindRequiredParam }]
                    [{ nameof(requiredAndBindRequiredParam) }:{ requiredAndBindRequiredParam }]
                    [{ nameof(optionalStringLengthParam) }:{ optionalStringLengthParam }]
                    [{ nameof(optionalRangeDisplayNameParam) }:{ optionalRangeDisplayNameParam }]");
            }
            else
            {
                return BadRequest(ModelState);
            }
        }
    }
}
