namespace ServiceCenter.Controllers
{
    #region Using
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web.Mvc;

    using Data = ServiceCenter.Data.CastleActiveRecord;
    #endregion

    public class RequestController : Controller
    {
        #region Список
        public ActionResult Index()
        {
            ViewBag.Title = "Заявки";

            List<Data.Request> requests = Data.Request.FindAll().OrderBy(x => x.DateIn).ToList();

            return View(requests);
        }

        /// <summary>
        /// Список заявок сотрудника
        /// </summary>
        /// <param name="id">Id сотрудника</param>
        public ActionResult Employee(int id)
        {
            ViewBag.Title = "Заявки";

            Data.Employee employee = Data.Employee.Find(id);

            ViewBag.Message = string.Format("Для сотрудника: {0}", employee.FullName);

            return View(employee.Requests.OrderBy(x => x.DateIn));
        }

        /// <summary>
        /// Список заявок со статусом
        /// </summary>
        /// <param name="id">Id статуса</param>
        public ActionResult Status(int id)
        {
            ViewBag.Title = "Заявки";

            Data.Status status = Data.Status.Find(id);

            ViewBag.Message = string.Format("Со статусом: {0}", status.Value);

            return View(status.Requests.OrderBy(x => x.DateIn));
        }

        /// <summary>
        /// Список заявок по производителю
        /// </summary>
        /// <param name="id">Id производителя</param>
        public ActionResult Manufacturer(int id)
        {
            ViewBag.Title = "Заявки";

            Data.Manufacturer manufacturer = Data.Manufacturer.Find(id);

            ViewBag.Message = string.Format("Производитель: {0}", manufacturer.Value);

            return View(manufacturer.Requests.OrderBy(x => x.DateIn));
        }
        #endregion

        #region Создание
        public ActionResult Create()
        {
            ViewBag.Title = "Заявки - добавление записи";

            return View();
        }

        [HttpPost]
        public ActionResult Create(Data.Request request, FormCollection collection)
        {
            ViewBag.Title = "Заявки - добавление записи";

            int employeeId = 0;
            if (!Int32.TryParse(collection["EmployeeId"], out employeeId))
                ModelState.AddModelError("Employee", "Выберите исполнителя!");

            int deviceTypeId = 0;
            if (!Int32.TryParse(collection["DeviceTypeId"], out deviceTypeId))
                ModelState.AddModelError("DeviceType", "Выберите тип устройства!");

            int manufacturerId = 0;
            if (!Int32.TryParse(collection["ManufacturerId"], out manufacturerId))
                ModelState.AddModelError("Manufacturer", "Выберите производителя!");

            if (!ModelState.IsValid)
                return View(request);

            request.Employee = Data.Employee.Find(employeeId);
            request.DeviceType = Data.DeviceType.Find(deviceTypeId);
            request.Manufacturer = Data.Manufacturer.Find(manufacturerId);
            request.Status = Data.Status.Find(1); // статус => "Принято"

            try
            {
                request.Create();
                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", string.Format("При создании записи возникла ошибка:{0}{1}", Environment.NewLine, ex.Message));
                return View(request);
            }
        }
        #endregion

        #region Редактирование
        public ActionResult Edit(int id)
        {
            ViewBag.Title = "Сотрудники - редактирование записи";

            Data.Request request = Data.Request.Find(id);

            ViewBag.Message = string.Format("Заявка №{0} от {1:dd.MM.yyyy}", request.Id, request.DateIn);

            return View(request);
        }

        [HttpPost]
        public ActionResult Edit(Data.Request request, FormCollection collection)
        {
            ViewBag.Title = "Сотрудники - редактирование записи";
            ViewBag.Message = string.Format("Заявка №{0} от {1:dd.MM.yyyy}", request.Id, request.DateIn);

            int employeeId = 0;
            if (!Int32.TryParse(collection["EmployeeId"], out employeeId))
                ModelState.AddModelError("Employee", "Выберите исполнителя!");

            int deviceTypeId = 0;
            if (!Int32.TryParse(collection["DeviceTypeId"], out deviceTypeId))
                ModelState.AddModelError("DeviceType", "Выберите тип устройства!");

            int manufacturerId = 0;
            if (!Int32.TryParse(collection["ManufacturerId"], out manufacturerId))
                ModelState.AddModelError("Manufacturer", "Выберите производителя!");

            int statusId = 0;
            if (!Int32.TryParse(collection["StatusId"], out statusId))
                ModelState.AddModelError("Status", "Статус заявки должен быть указан!");

            if (!ModelState.IsValid)
                return View(request);

            request.Employee = Data.Employee.Find(employeeId);
            request.DeviceType = Data.DeviceType.Find(deviceTypeId);
            request.Manufacturer = Data.Manufacturer.Find(manufacturerId);
            request.Status = Data.Status.Find(statusId);

            try
            {
                request.Save();
                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", string.Format("При редактировании записи возникла ошибка:{0}{1}", Environment.NewLine, ex.Message));
                return View(request);
            }
        }
        #endregion

        #region Удаление
        public ActionResult Delete(int id)
        {
            Data.Request request = Data.Request.Find(id);

            request.Delete();

            return RedirectToAction("Index");
        }
        #endregion
    }
}
