using System;
using System.Linq;
using System.Web.Mvc;
using Wierszowki.Core.Linq;
using Wierszowki.Models;
using Wierszowki.Services;
using xVal.ServerSide;

namespace Wierszowki.Controllers
{
    public class MagazineItemController : Controller
    {
        private readonly WierszowkiDataContext _context;
        private readonly MagazineItemService _service;

        public MagazineItemController()
        {
            _context = new WierszowkiDataContext();
            _service = new MagazineItemService();
        }

        public ActionResult Index()
        {
            return RedirectToAction("Index", "Report");
        }

        [Authorize]
        [AcceptVerbs(HttpVerbs.Get)]
        [OutputCache(Duration = 10, VaryByParam = "none")]
        public ActionResult Create()
        {
            var viewData = InitMagazineItemViewData();
            return View(viewData);
        }

        [Authorize]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create(MagazineItem magazineItem)
        {
            try
            {
                _service.Create(magazineItem, ControllerContext.HttpContext.User.Identity.Name);
                ModelState.Clear();
            }
            catch (RulesException ex)
            {
                ex.AddModelStateErrors(ModelState, "magazineItem");
            }

            if (ModelState.IsValid)
            {
                return RedirectToAction("Confirm", _context.Authors.Single(a => a.Id == magazineItem.AuthorId));
            }

            var viewData = InitMagazineItemViewData();
            viewData.MagazineItem = magazineItem;
            return View(viewData);
        }

        [Authorize]
        public ActionResult Confirm(Author author)
        {
            return View(author);
        }

        [Authorize]
        public ActionResult Edit(int id)
        {
            var viewData = InitMagazineItemViewData();
            var magazineItem = _service.Find(id);
            viewData.MagazineItem = magazineItem;
            viewData.Magazine = magazineItem.Issue.Magazine;
            viewData.Issue = magazineItem.Issue;
            viewData.IssueList = new SelectList(_context.FindIssuesByMagazineItemId(magazineItem.Issue.Id), "Id", "Number");
            return View(viewData);
        }

        [Authorize]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Update(MagazineItem magazineItem)
        {
            try
            {
                //var service = new MagazineItemService();
                _service.Update(magazineItem, ControllerContext.HttpContext.User.Identity.Name);
                ModelState.Clear();
            }
            catch (RulesException ex)
            {
                ex.AddModelStateErrors(ModelState, "magazineItem");
            }

            if (ModelState.IsValid)
            {
                var author = _context.Authors.Single(a => a.Id == magazineItem.AuthorId);

                return RedirectToAction("Confirm", author);
            }

            var viewData = InitMagazineItemViewData();
            viewData.MagazineItem = magazineItem;
            return View(viewData);
        }

        private MagazineItemViewData InitMagazineItemViewData()
        {
            var viewData = new MagazineItemViewData
                               {
                                   MagazineItem = new MagazineItem(),
                                   AuthorList = new SelectList(_context.Authors.ToList(), "Id", "FullName"),
                                   MagazineList = new SelectList(_context.Magazines.ToList(), "Id", "NickName"),
                                   IssueList = new SelectList(_context.FindIssuesByMagazineId(0), "Id", "Name"),
                                   ItemTypeList = new SelectList(_context.ItemTypes.ToList(), "Id", "Name")
                               };
            return viewData;
        }
    }
}