namespace ServiceCenter.Data.DapperNet
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;

    using Contrib = Dapper.Contrib.Extensions;

    /// <summary>
    /// Заявка
    /// </summary>
    [Contrib.Table("Request"), DisplayName("Заявка")]
    public class Request
    {
        /// <summary>
        /// Ключ
        /// </summary>
        [DisplayName("Id"), Contrib.Key]
        public int RequestId { get; set; }

        /// <summary>
        /// Ответственный/исполнитель
        /// </summary>
        [DisplayName("Ответственный/исполнитель")]
        public int EmployeeId { get; set; }

        /// <summary>
        /// Ответственный/исполнитель
        /// </summary>
        [DisplayName("Ответственный/исполнитель"), Contrib.Computed]
        public Employee Employee { get; set; }

        /// <summary>
        /// Дата приёма
        /// </summary>
        [DisplayName("Дата приёма"),
        DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "dd.MM.yyyy", NullDisplayText = "Дата приёма не может быть пустой"),
        DataType(DataType.Date)]
        public DateTime DateIn { get; set; }

        /// <summary>
        /// Дата выдачи
        /// </summary>
        [DisplayName("Дата выдачи"),
        DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "dd.MM.yyyy", ConvertEmptyStringToNull = true),
        DataType(DataType.Date)]
        public DateTime? DateOut { get; set; }

        /// <summary>
        /// Тип устройства
        /// </summary>
        [DisplayName("Тип устройства")]
        public int DeviceTypeId { get; set; }

        /// <summary>
        /// Тип устройства
        /// </summary>
        [DisplayName("Тип устройства"), Contrib.Computed]
        public DeviceType DeviceType { get; set; }

        /// <summary>
        /// Производитель
        /// </summary>
        [DisplayName("Производитель")]
        public int ManufacturerId { get; set; }

        /// <summary>
        /// Производитель
        /// </summary>
        [DisplayName("Производитель"), Contrib.Computed]
        public Manufacturer Manufacturer { get; set; }

        /// <summary>
        /// Модель
        /// </summary>
        [DisplayName("Модель"),
        DisplayFormat(NullDisplayText = "Название модели не может быть пустым"),
        Required(ErrorMessage = "Название модели не может быть пустым"),
        DataType(DataType.Text)]
        public string Model { get; set; }

        /// <summary>
        /// Описание неисправности
        /// </summary>
        [DisplayName("Описание неисправности"),
        DisplayFormat(NullDisplayText = "Описание не может быть пустым"),
        Required(ErrorMessage = "Описание не может быть пустым"), 
        DataType(DataType.MultilineText), 
        StringLength(250, ErrorMessage = "Максимум 250 символов")]
        public string Description { get; set; }

        /// <summary>
        /// Ф.И.О. клиента
        /// </summary>
        [DisplayName("Ф.И.О. клиента"),
        DisplayFormat(NullDisplayText = "Ф.И.О. клиента не может быть пустым"),
        Required(ErrorMessage = "Ф.И.О. клиента не может быть пустым"), 
        DataType(DataType.Text), 
        StringLength(150, ErrorMessage = "Максимум 150 символов")]
        public string ClientName { get; set; }

        /// <summary>
        /// Телефон клиента
        /// </summary>
        [DisplayName("Телефон клиента"), 
        DataType(DataType.Text), 
        StringLength(50, ErrorMessage = "Максимум 50 символов")]
        public string ClientPhone { get; set; }

        /// <summary>
        /// Стоимость ремонта
        /// </summary>
        [DisplayName("Стоимость ремонта"),
        Required(ErrorMessage = "Поле 'Стоимость ремонта' не может быть пустым"), 
        Range(0, 10000, ErrorMessage = "Введите значение от 0 до 10000")]
        public int Cost { get; set; }

        /// <summary>
        /// Статус заявки
        /// </summary>
        [DisplayName("Статус заявки")]
        public int StatusId { get; set; }

        /// <summary>
        /// Статус заявки
        /// </summary>
        [DisplayName("Статус заявки"), Contrib.Computed]
        public Status Status { get; set; }

        /// <summary>
        /// Комметарий исполнителя
        /// </summary>
        [DisplayName("Комметарий исполнителя"), 
        DataType(DataType.MultilineText), 
        StringLength(250, ErrorMessage = "Максимум 250 символов")]
        public string Comment { get; set; }
    }
}
