Clear        


                
                    #nullable disable
using APP.Models;
using CORE.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;

// Generated from Custom MVC Template.

namespace MVC.Controllers
{
    [Authorize(Roles = "Admin")]
    // Only authenticated users with role Admin can execute all
    // of the actions of this controller.
    public class RolesController : Controller
    {
        // Service injections:
        private readonly IService<RoleRequest, RoleResponse> _roleService;

        /* 
            Can be uncommented and used for many to many relationships, 
            "entity" may be replaced with the related entity name in 
            the controller and views. 
        */
        //private readonly IService<EntityRequest, EntityResponse> _EntityService;

        public RolesController(
			IService<RoleRequest, RoleResponse> roleService

            /* 
                Can be uncommented and used for many to many relationships, 
                "entity" may be replaced with the related entity name in 
                the controller and views. 
            */
            //, IService<EntityRequest, EntityResponse> EntityService
        )
        {
            _roleService = roleService;

            /* 
                Can be uncommented and used for many to many relationships, 
                "entity" may be replaced with the related entity name in 
                the controller and views.
            */
            //_EntityService = EntityService;
        }

        private void SetViewData()
        {
            /* 
                ViewBag and ViewData are the same collection (dictionary).
                They carry extra data other than the model from a controller 
                action to its view, or between views.
            */

            // Related items service logic to set ViewData (Id and
            // Name parameters may need to be changed in the SelectList
            // constructor according to the model):
            
            /* 
                Can be uncommented and used for many to many relationships, 
                "entity" may be replaced with the related entity name in 
                the controller and views. 
            */
            //ViewBag.EntityIds = new MultiSelectList(_EntityService.List(),
            //  "Id", "Name");
        }

        private void SetTempData(string message, string key = "Message")
        {
            /*
                TempData is used to carry extra data to the redirected 
                controller action's view.
            */

            TempData[key] = message;
        }

        // GET: Roles
        public IActionResult Index()
        {
            // Get collection service logic:
            var list = _roleService.List();
            return View(list); 
            // return response collection as model to the Index view
        }

        // GET: Roles/Details/5
        public IActionResult Details(int id)
        {
            // Get item service logic:
            var item = _roleService.Single(id);
            return View(item); 
            // return response item as model to the Details view
        }

        // GET: Roles/Create
        public IActionResult Create()
        {
            SetViewData(); 
            // set ViewData dictionary to carry extra data other
            // than the model to the view
            return View(); 
            // return Create view with no model
        }

        // POST: Roles/Create
        [HttpPost, ValidateAntiForgeryToken]
        public IActionResult Create(RoleRequest role)
        {
            if (ModelState.IsValid) 
            // check data annotation validation errors in the request
            {
                // Insert item service logic:
                var response = _roleService.Add(role);
                if (response.IsSuccessful)
                {
                    SetTempData(response.Message); 
                    // set TempData dictionary to carry the message
                    // to the redirected action's view
                    return RedirectToAction(nameof(Details), 
                        new { id = response.Id }); 
                    // redirect to Details action with id parameter
                    // as response.Id route value
                }
                ModelState.AddModelError("", response.Message); 
                // to display service error message in the validation
                // summary of the view
            }
            SetViewData(); 
            // set ViewData dictionary to carry extra data other
            // than the model to the view
            return View(role); 
            // return request as model to the Create view
        }

        // GET: Roles/Edit/5
        public IActionResult Edit(int id)
        {
            // Get item to edit service logic:
            var item = _roleService.Edit(id);
            SetViewData(); 
            // set ViewData dictionary to carry extra data other
            // than the model to the view
            return View(item); 
            // return request as model to the Edit view
        }

        // POST: Roles/Edit
        [HttpPost, ValidateAntiForgeryToken]
        public IActionResult Edit(RoleRequest role)
        {
            if (ModelState.IsValid) 
            // check data annotation validation errors in the request
            {
                // Update item service logic:
                var response = _roleService.Update(role);
                if (response.IsSuccessful)
                {
                    SetTempData(response.Message); 
                    // set TempData dictionary to carry the message
                    // to the redirected action's view
                    return RedirectToAction(nameof(Details), 
                        new { id = response.Id }); 
                    // redirect to Details action with id parameter
                    // as response.Id route value
                }
                ModelState.AddModelError("", response.Message); 
                // to display service error message in the validation
                // summary of the view
            }
            SetViewData();
            // set ViewData dictionary to carry extra data other
            // than the model to the view
            return View(role); 
            // return request as model to the Edit view
        }

        // GET: Roles/Delete/5
        public IActionResult Delete(int id)
        {
            // Get item to delete service logic:
            var item = _roleService.Single(id);
            return View(item); 
            // return response item as model to the Delete view
        }

        // POST: Roles/Delete
        [HttpPost, ValidateAntiForgeryToken, ActionName("Delete")]
        public IActionResult DeleteConfirmed(int id)
        {
            // Delete item service logic:
            var response = _roleService.Remove(id);
            SetTempData(response.Message); 
            // set TempData dictionary to carry the message
            // to the redirected action's view
            return RedirectToAction(nameof(Index)); 
            // redirect to the Index action
        }
    }
}