﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace Studio_V.Core.Domain
{
    /// <summary> 
    /// Модель устройства 
    /// </summary>
    public class ModelInfo : DomainObject
    {
        public ModelInfo()
        {
            ModelType = new ModelType();
            ModelMaker = new ModelMaker();
            Name = "";
            LastUpdate = DateTime.Now;
        }

        public ModelInfo(int id, ModelType type, ModelMaker maker, string name, IList<ModelFeature> properties, DateTime lastUpdate)
        {
            Id = id;
            ModelType = type;
            ModelMaker = maker;
            Name = name;
            _properties = (List<ModelFeature>) properties;
            LastUpdate = lastUpdate;
        }

        /// <summary> Название модели </summary>
        public string Name { get; set; }
        
        /// <summary> Тип устройства </summary>
        public ModelType ModelType { get; set; }
        
        /// <summary> Производитель устройства </summary>
        public ModelMaker ModelMaker { get; set; }

        /// <summary> Свойства устройства </summary>
        public ReadOnlyCollection<ModelFeature> Features
        {
            get { return _properties.AsReadOnly(); }
        }

        /// <summary> Дата последнего обновления записи </summary>
        public DateTime LastUpdate { get; private set; }

        /// <summary>
        /// Добавить свойства модели в коллекцию свойств.
        /// </summary>
        /// <param name="param">Параметр устройства (соответствующий типу устройства)</param>
        /// <param name="value">Значение параметра</param>
        public void AddProperty(ModelParam param, string value)
        {
            int index = _properties.FindIndex(props => props.Param.Id == param.Id);
            if (index > 0)
                _properties[index].Value = value;
            else
            {
                if (ModelType.Id == param.Type.Id)
                    _properties.Add(new ModelFeature(param, value));
                else
                    throw new InvalidOperationException("Model type and Param type must be equal!");
            }
        }

        /// <summary>
        /// Удаление свойства устройства из коллекции свойств
        /// </summary>
        /// <param name="param">Параметр для удаления</param>
        public void RemoveProperty(ModelParam param)
        {
            int index = _properties.FindIndex(props => props.Param.Id == param.Id);
            if (index >= 0)
                _properties.RemoveAt(index);
        }

        private readonly List<ModelFeature> _properties;
    }
}
