using System;
using System.Collections.Generic;
using System.Linq;
using InABox.Clients;
namespace InABox.Core
{
///
///
///
/// Should always be an EntityForm<,>
public class DigitalFormReportDataModel : AutoDataModel
where T : Entity, IRemotable, IPersistent, new()
{
private Guid? FormId { get; set; } = null;
private CoreTable? FormDataTable { get; set; } = null;
private DigitalFormVariable[] Variables = null;
public DigitalFormReportDataModel(Filter filter, Guid? formId = null) : base(filter)
{
FormId = formId;
}
public override string Name => "Digital Form Reports";
protected override void CheckRequiredTables(List requiredtables)
{
base.CheckRequiredTables(requiredtables);
requiredtables.Add(TableName());
}
private void LoadFormDataTable(Guid formID)
{
var formDataTable = new CoreTable();
formDataTable.Columns.Add(new CoreColumn
{
ColumnName = "Parent.ID",
DataType = typeof(Guid)
});
var variables = new Client().Load(new Filter(x => x.Form.ID).IsEqualTo(formID));
foreach (var variable in variables)
formDataTable.Columns.Add(
new CoreColumn
{
ColumnName = variable.Code,
DataType = DigitalFormVariable.DataType(variable.FieldType())
}
);
FormDataTable = formDataTable;
Variables = variables;
AddTable(typeof(CoreTable), formDataTable, true, "Form_Data");
LinkTable(typeof(T), "ID", typeof(CoreTable), "Parent.ID", childalias: "Form_Data");
}
protected override void AfterLoad(IEnumerable requiredtables)
{
base.AfterLoad(requiredtables);
if(FormDataTable == null)
{
LoadFormDataTable(FormId ?? ExtractValues(x => (x as IDigitalFormInstance).Form.ID).FirstOrDefault());
}
var idList = ExtractValues(x => x.ID);
var jsonLists = ExtractValues(x => (x as IDigitalFormInstance).FormData);
var formDatas = jsonLists.Select(x => Serialization.Deserialize>(x));
foreach (var (i, formData) in formDatas.Select((x, i) => new Tuple>(i, x)))
{
var formRow = FormDataTable.NewRow();
formRow["Parent.ID"] = idList[i];
if(formData != null)
{
foreach (var key in formData.Keys)
{
var variable = Variables.FirstOrDefault(x => string.Equals(x.Code, key));
if (variable != null)
formRow[key] = variable.ParseValue(formData[key]);
}
}
FormDataTable.Rows.Add(formRow);
}
Load(typeof(CoreTable), FormDataTable, requiredtables, "Form_Data");
}
}
}