using Disco.Models.Services.Devices.Importing; using Disco.Services.Devices.Importing.Fields; using System; using System.Collections.Generic; using System.Linq; namespace Disco.Services.Devices.Importing { public abstract class BaseDeviceImportContext : IDeviceImportContext { private static Lazy> FieldHandlers = new Lazy>(() => { return new Dictionary() { { DeviceImportFieldTypes.DeviceSerialNumber, typeof(DeviceSerialNumberImportField) }, { DeviceImportFieldTypes.DeviceComputerName, typeof(DeviceComputerNameImportField) }, { DeviceImportFieldTypes.DeviceAssetNumber, typeof(DeviceAssetNumberImportField) }, { DeviceImportFieldTypes.DeviceLocation, typeof(DeviceLocationImportField) }, { DeviceImportFieldTypes.DeviceAllowUnauthenticatedEnrol, typeof(DeviceAllowUnauthenticatedEnrolImportField) }, { DeviceImportFieldTypes.DeviceDecommissionedDate, typeof(DeviceDecommissionedDateImportField) }, { DeviceImportFieldTypes.DeviceDecommissionedReason, typeof(DeviceDecommissionedReasonImportField) }, { DeviceImportFieldTypes.DetailLanMacAddress, typeof(DetailLanMacAddressImportField) }, { DeviceImportFieldTypes.DetailWLanMacAddress, typeof(DetailWLanMacAddressImportField) }, { DeviceImportFieldTypes.DetailACAdapter, typeof(DetailACAdapterImportField) }, { DeviceImportFieldTypes.DetailBattery, typeof(DetailBatteryImportField) }, { DeviceImportFieldTypes.DetailKeyboard, typeof(DetailKeyboardImportField) }, { DeviceImportFieldTypes.ModelId, typeof(ModelIdImportField) }, { DeviceImportFieldTypes.BatchId, typeof(BatchIdImportField) }, { DeviceImportFieldTypes.ProfileId, typeof(ProfileIdImportField) }, { DeviceImportFieldTypes.AssignedUserId, typeof(AssignedUserIdImportField) } }; }); private List columns; private Dictionary columnsByType; public string SessionId { get; } public string Filename { get; } public string DatasetName { get; private set; } public abstract int RecordCount { get; } public List Records { get; set; } public int AffectedRecords { get; set; } public int ColumnCount { get { return columns.Count; } } public IEnumerable Columns { get { if (columns == null) throw new ArgumentNullException(nameof(columns)); return columns; } } public BaseDeviceImportContext(string Filename) { SessionId = Guid.NewGuid().ToString("D"); this.Filename = DatasetName = string.IsNullOrWhiteSpace(Filename) ? "" : Filename; } public abstract IDeviceImportDataReader GetDataReader(); public IDeviceImportColumn GetColumn(int Index) { if (columns == null) throw new ArgumentNullException(nameof(columns)); return columns[Index]; } public void SetColumnType(int Index, DeviceImportFieldTypes Type) { if (columns == null) throw new ArgumentNullException(nameof(columns)); var column = columns[Index]; if (column.Type == Type) { return; // No change } if (column.Type != DeviceImportFieldTypes.IgnoreColumn) { columnsByType.Remove(column.Type); } column.Type = Type; if (Type == DeviceImportFieldTypes.IgnoreColumn) { column.Handler = null; } else { columnsByType[Type] = column; column.Handler = FieldHandlers.Value[Type]; } } public int? GetColumnByType(DeviceImportFieldTypes FieldType) { if (columnsByType == null) throw new ArgumentNullException(nameof(columnsByType)); DeviceImportColumn column; if (columnsByType.TryGetValue(FieldType, out column)) { return column.Index; } else { return null; } } protected void SetDatasetName(string DatasetName) { this.DatasetName = DatasetName; } protected void SetColumns(IEnumerable Columns) { columns = Columns.ToList(); columnsByType = columns .Where(c => c.Type != DeviceImportFieldTypes.IgnoreColumn) .ToDictionary(c => c.Type); } public IEnumerable> GetFieldHandlers() { return FieldHandlers.Value; } } }