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

    using Castle.ActiveRecord;

    /// <summary>
    /// Заявка
    /// </summary>
    [ActiveRecord("Request", Schema = "dbo", UseAutoImport = false), DisplayName("Заявка")]
    public class Request : ActiveRecordBase
    {
        #region Свойства
        /// <summary>
        /// Ключ
        /// </summary>
        [Key, PrimaryKey(PrimaryKeyType.Native, Column = "RequestId"), DisplayName("Id")]
        public int Id { get; set; }

        /// <summary>
        /// Ответственный/исполнитель
        /// </summary>
        [DisplayName("Ответственный/исполнитель"),
        BelongsTo(Column = "EmployeeId", NotFoundBehaviour = NotFoundBehaviour.Exception, NotNull = true, Type = typeof(Employee))]
        public Employee Employee { get; set; }

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

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

        /// <summary>
        /// Тип устройства
        /// </summary>
        [DisplayName("Тип устройства"),
        BelongsTo(Column = "DeviceTypeId", NotFoundBehaviour = NotFoundBehaviour.Exception, NotNull = true, Type = typeof(DeviceType))]
        public DeviceType DeviceType { get; set; }

        /// <summary>
        /// Производитель
        /// </summary>
        [DisplayName("Производитель"),
        BelongsTo(Column = "ManufacturerId", NotFoundBehaviour = NotFoundBehaviour.Exception, NotNull = true, Type = typeof(Manufacturer))]
        public Manufacturer Manufacturer { get; set; }

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

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

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

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

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

        /// <summary>
        /// Статус заявки
        /// </summary>
        [DisplayName("Статус заявки"),
        BelongsTo(Column = "StatusId", NotFoundBehaviour = NotFoundBehaviour.Exception, NotNull = true, Type = typeof(Status))]
        public Status Status { get; set; }

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

        #region Общие методы
        /// <summary>
        /// Возвращает все записи
        /// </summary>
        public static List<Request> FindAll()
        {
            //using (new Castle.ActiveRecord.TransactionScope(TransactionMode.New))
            return new List<Request>((Request[])ActiveRecordMediator.FindAll(typeof(Request)));
        }

        /// <summary>
        /// Возвращает запись по её Id
        /// </summary>
        /// <param name="id">Id записи в БД</param>
        public static Request Find(int id)
        {
            return ActiveRecordMediator<Request>.FindByPrimaryKey(id, false);
        }
        #endregion

        #region Overrides
        /// <summary>
        /// Сохранить новый объект в БД
        /// </summary>
        public override void Create()
        {
            this.DateIn = DateTime.Now;

            base.Create();
        }

        /// <summary>
        /// Сохранить в БД
        /// </summary>
        public override void Save()
        {
            if (this.Status.Id == 5 || this.Status.Id == 6)
                this.DateOut = DateTime.Now;
            else
                this.DateOut = null;

            base.Save();
        }
        #endregion
    }
}
