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

    using Data = ServiceCenter.Data.BLT;
    #endregion

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

            Data.DataService ds = new Data.DataService();
            List<Data.Request> requests = ds.GetRequests().OrderBy(x => x.DateIn).ToList();

            return View(requests);
        }

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

            Data.DataService ds = new Data.DataService();
            Data.Employee employee = ds.GetEmployee(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.DataService ds = new Data.DataService();
            Data.Status status = ds.GetStatus(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.DataService ds = new Data.DataService();
            Data.Manufacturer manufacturer = ds.GetManufacturer(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 = "Заявки - добавление записи";

            bool hasErrors = false;

            int employeeId = 0;

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

            int deviceTypeId = 0;

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

            int manufacturerId = 0;

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

            if (string.IsNullOrEmpty(request.Model))
            {
                ModelState.AddModelError("", "Название модели не может быть пустым!");
                hasErrors = true;
            }

            if (string.IsNullOrEmpty(request.Description))
            {
                ModelState.AddModelError("", "Описание проблемы не может быть пустым!");
                hasErrors = true;
            }

            if (string.IsNullOrEmpty(request.ClientName))
            {
                ModelState.AddModelError("", "Имя клиента не может быть пустым!");
                hasErrors = true;
            }

            if (hasErrors)
                return View();

            request.EmployeeId = employeeId;
            request.DeviceTypeId = deviceTypeId;
            request.ManufacturerId = manufacturerId;
            request.StatusId = 1;

            Data.DataService ds = new Data.DataService();

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

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

            Data.DataService ds = new Data.DataService();
            Data.Request request = ds.GetRequest(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);

            bool hasErrors = false;

            int employeeId = 0;

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

            int deviceTypeId = 0;

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

            int manufacturerId = 0;

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

            if (string.IsNullOrEmpty(request.Model))
            {
                ModelState.AddModelError("", "Название модели не может быть пустым!");
                hasErrors = true;
            }

            if (string.IsNullOrEmpty(request.Description))
            {
                ModelState.AddModelError("", "Описание проблемы не может быть пустым!");
                hasErrors = true;
            }

            if (string.IsNullOrEmpty(request.ClientName))
            {
                ModelState.AddModelError("", "Имя клиента не может быть пустым!");
                hasErrors = true;
            }

            int statusId = 0;

            if (!Int32.TryParse(collection["StatusId"], out statusId))
            {
                ModelState.AddModelError("", "Укажите статус заявки!");
                hasErrors = true;
            }

            if (hasErrors)
                return View(request);

            request.EmployeeId = employeeId;
            request.DeviceTypeId = deviceTypeId;
            request.ManufacturerId = manufacturerId;
            request.StatusId = statusId;

            Data.DataService ds = new Data.DataService();

            try
            {
                ds.SaveRequest(request);
                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.DataService ds = new Data.DataService();
            Data.Request request = ds.GetRequest(id);

            ds.DeleteRequest(request);

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