using System.Linq;
using System.Web.Mvc;
using Wierszowki.Core.Linq;
using Wierszowki.Models;
using Wierszowki.Services;
using xVal.ServerSide;
using System.Collections.Generic;
using Wierszowki.Core.Interfaces;

namespace Wierszowki.Controllers
{
    public class AuthorController : Controller
    {
        private readonly WierszowkiDataContext _context;

        public AuthorController()
        {
            _context = new WierszowkiDataContext();
        }

        public ActionResult Index()
        {
            var authors = _context.GetAuthors();
            return View(authors);
        }

        [Authorize]
        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Create()
        {
            var authorViewData = new AuthorViewData
            {
                Author = new Author(),
                EmploymentTypeList = new SelectList(_context.GetEmploymentTypes().ToList(), "Id", "Name")
            };

            return View(authorViewData);
        }

        [Authorize]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create(Author author)
        {
            var authorService = new AuthorService();
            try
            {
                authorService.Create(author);
            }
            catch (RulesException ex)
            {
                ex.AddModelStateErrors(ModelState, "author");
            }

            if (ModelState.IsValid)
            {
                var confirmViewData = new ConfirmViewData();
                confirmViewData = InitConfirmViewData(author, OperationType.Create, null);
                return View("Confirm", confirmViewData); 
                //return RedirectToAction("Confirm", author);
            }


            var authorViewData = new AuthorViewData
            {
                Author = author,
                EmploymentTypeList = new SelectList(_context.GetEmploymentTypes().ToList(), "Id", "Name")
            };
            return View(authorViewData);
        }


        [Authorize]
        public ActionResult Confirm(Author author)
        {
            return View(author);
        }

        [Authorize]
        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Edit(int id)
        {
            var authorViewData = new AuthorViewData
            {
                Author = _context.GetAuthorById(id),
                EmploymentTypeList = new SelectList(_context.GetEmploymentTypes().ToList(), "Id", "Name")
            };

            return View(authorViewData);
        }

        [Authorize]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Edit(Author author)
        {
            var authorService = new AuthorService();
            try
            {
                authorService.Update(author);
            }
            catch (RulesException ex)
            {
                ex.AddModelStateErrors(ModelState, "author");
            }

            if (ModelState.IsValid)
            {
                var confirmViewData = new ConfirmViewData();
                confirmViewData = InitConfirmViewData(author, OperationType.Update, null);
                return View("Confirm", confirmViewData); 
            }
            var authorViewData = new AuthorViewData
            {
                Author = author,
                EmploymentTypeList = new SelectList(_context.GetEmploymentTypes().ToList(), "Id", "Name")
            };

            return View(authorViewData);
        }
        private ConfirmViewData InitConfirmViewData(Author author, OperationType c_type, Info inf)
        {
            var viewData = new ConfirmViewData
            {
                Author = author,
                akcja = c_type,
                info = inf
            };
            return viewData;
        }
    }
}