using System.Text;

namespace EDAViewer.Singleton.Helper;

[Serializable]
public class Common
{

    public string? ConfigurationProductiveState { get; set; }
    public string? ConfigurationState { get; set; }
    public string? ContainerName { get; set; }
    public ModuleInstanceTypeName? ObjectType { get; set; }
    public string? UnitName { get; set; }
    //
    public string Filename { get; set; }
    public string StartTimeFormat { get; set; }
    public string[] StoragePaths { get; set; }
    //
    public List<string[]> GeneralTriggers { get; set; }
    public List<string[]> LogisticsAttributes { get; set; }
    public List<string[]> LogisticsColumns { get; set; }
    public string LogisticsEquipmentAlias { get; set; }
    public List<string?[]> LogisticsTriggers { get; set; }
    public Dictionary<int, List<string[]>> LogisticsTriggersCallDefinitionAttributes { get; set; }
    public Dictionary<int, string[]> LogisticsTriggersKeysKeyMapping { get; set; }
    public List<string[]> Parameters { get; set; }
    public string ParametersAsCsv { get; set; }
    public string Source { get; set; }
    public List<string[]> StartTriggersDCP { get; set; }
    public List<string[]> StopTriggersDCP { get; set; }

    [Obsolete("Only for DeserializeObject")]
    public Common()
    {
        ObjectType = null;
        Parameters = new();
        Source = string.Empty;
        Filename = string.Empty;
        GeneralTriggers = new();
        StopTriggersDCP = new();
        UnitName = string.Empty;
        LogisticsColumns = new();
        StartTriggersDCP = new();
        LogisticsTriggers = new();
        LogisticsAttributes = new();
        ContainerName = string.Empty;
        ParametersAsCsv = string.Empty;
        StartTimeFormat = string.Empty;
        ConfigurationState = string.Empty;
        StoragePaths = Array.Empty<string>();
        LogisticsEquipmentAlias = string.Empty;
        ConfigurationProductiveState = string.Empty;
        LogisticsTriggersKeysKeyMapping = new Dictionary<int, string[]>();
        LogisticsTriggersCallDefinitionAttributes = new Dictionary<int, List<string[]>>();
    }

    public Common(ModuleInstanceTypeName objectType, object unitName, object containerName, object configurationState, object configurationProductiveState)
    {
        Parameters = new();
        Source = string.Empty;
        Filename = string.Empty;
        GeneralTriggers = new();
        ObjectType = objectType;
        StopTriggersDCP = new();
        LogisticsColumns = new();
        StartTriggersDCP = new();
        LogisticsTriggers = new();
        LogisticsAttributes = new();
        ParametersAsCsv = string.Empty;
        StartTimeFormat = string.Empty;
        UnitName = unitName.ToString();
        StoragePaths = Array.Empty<string>();
        LogisticsEquipmentAlias = string.Empty;
        ContainerName = containerName.ToString();
        ConfigurationState = configurationState.ToString();
        LogisticsTriggersKeysKeyMapping = new Dictionary<int, string[]>();
        ConfigurationProductiveState = configurationProductiveState.ToString();
        LogisticsTriggersCallDefinitionAttributes = new Dictionary<int, List<string[]>>();
    }

    public void Update(PDSFConfiguration configuration)
    {
        StoragePaths = configuration.Settings.StoragePaths;
        StartTimeFormat = configuration.Settings.StartTimeFormat;
        Filename = configuration.Settings.Filename;
        //
        Source = configuration.DataCollection.Source;
        LogisticsEquipmentAlias = configuration.DataCollection.Logistics.EquipmentAlias;
        //if (LogisticsEquipmentAlias == "R47-PLC")
        //{ }
        foreach (PDSFConfigurationDataCollectionLogisticsAttribute item in from l in configuration.DataCollection.Logistics.Attributes orderby l.Use descending, l.Order select l)
            LogisticsAttributes.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.Key, item.Placeholder });
        foreach (PDSFConfigurationDataCollectionLogisticsColumn item in configuration.DataCollection.Logistics.Columns)
            LogisticsColumns.Add(new string[] { item.ID.ToString(), item.Prefix });
        foreach (PDSFConfigurationDataCollectionParameter1 item in from l in configuration.DataCollection.VirtualParameters orderby l.Use descending, l.Order select l)
        {
            if (string.IsNullOrEmpty(item.Alias) && !string.IsNullOrEmpty(item.Conditions.ConditionModel.Name))
            {
                if (item.Use)
                    Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Conditions.ConditionModel.Name, item.HardWareId, item.Description, item.Conditions.ConditionModel.Formula, true.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") });
                else
                    Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Conditions.ConditionModel.Name, item.HardWareId, item.Description, string.Empty, true.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") });
            }
            else
            {
                if (item.Use)
                    Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Alias, item.HardWareId, item.Description, item.Conditions.ConditionModel.Formula, true.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") });
                else
                    Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Alias, item.HardWareId, item.Description, string.Empty, true.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") });
            }
        }
        foreach (PDSFConfigurationDataCollectionParameter item in from l in configuration.DataCollection.Parameters orderby l.Use descending, l.Order select l)
        {
            if (string.IsNullOrEmpty(item?.Alias) && !string.IsNullOrEmpty(item?.Conditions?.ConditionModel?.Name))
            {
                if (item.Use)
                    Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Conditions.ConditionModel.Name, item.HardWareId, item.Description, item.Conditions.ConditionModel.Formula, false.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") });
                else
                    Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Conditions.ConditionModel.Name, item.HardWareId, item.Description, string.Empty, false.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") });
            }
            else
            {
                if (item is null)
                    continue;
                if (item.Use)
                    Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Alias, item.HardWareId, item.Description, item.Conditions.ConditionModel.Formula, false.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") });
                else
                    Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Alias, item.HardWareId, item.Description, string.Empty, false.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") });
            }
        }
        Parameters = (from l in Parameters orderby l[0] descending, l[1] select l).ToList();
        StringBuilder text = new();
        //text.AppendLine("\"AliasName\";\"Condition\";\"EventId\";\"ExceptionId\";\"Formula\";\"HardwareId\";\"OrderId\";\"ParameterName\";\"Remark\";\"ReportName\";\"SourceId\";\"Use\"");
        //"Test";"";"";"";"";"";"1";"MICROSCOPE01/MET08MESMICROSCOPE/Test";"";"MICROSCOPE01/MET08MESMICROSCOPE/FileRead";"";"True""
        _ = text.AppendLine("\"Use\";\"OrderId\";\"ReportName\";\"ParameterName\";\"AliasName\";\"HardwareId\";\"Remark\";\"Formula\"");
        foreach (string[] item in Parameters)
        {
            for (int i = 0; i < 7; i++)
                _ = text.Append('"').Append(item[i]).Append("\";");
            _ = text.Remove(text.Length - 1, 1);
            _ = text.AppendLine();
        }
        ParametersAsCsv = text.ToString();
        foreach (PDSFConfigurationDataCollectionGeneralTriggers item in configuration.DataCollection.GeneralTriggers)
        {
            foreach (PDSFConfigurationDataCollectionGeneralTriggersVariableModel gv in item.GlobalVariables)
                GeneralTriggers.Add(new string[] { item.Name, gv.Name, gv.ParameterName, gv.Formula });
        }
        {
            PDSFConfigurationDataCollectionStartTriggersDCP item = configuration.DataCollection.StartTriggers.DCP;
            if (item is not null)
                StartTriggersDCP.Add(new string[] { item.Name, item.Rule, item.ResolveGlobalVariableBeforeTrigger.ToString() });
        }
        if (configuration.DataCollection.Logistics.Triggers.UpdateTrigger is not null)
        {
            foreach (PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequest item in configuration.DataCollection.Logistics.Triggers.UpdateTrigger.LogisticRequest)
            {
                LogisticsTriggers.Add(new string?[] { item.Name.ToString(), item.LogisticsColumn.Fixed.ToString(), item.Rule, item.Keys.Scenario, item.Keys.DefaultJobIndex.ToString(), item.Keys.DefaultCarrierIndex.ToString(), item.Keys.DefaultSlotIndex.ToString(), item.DataPool.ToString() });
                if (item.Keys.KeyMapping is not null)
                    LogisticsTriggersKeysKeyMapping.Add(item.Name, new string[] { item.Keys.KeyMapping.KeyName, item.Keys.KeyMapping.ParameterName, item.Keys.KeyMapping.Formula });
                LogisticsTriggersCallDefinitionAttributes.Add(item.Name, new());
                foreach (PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinitionLogisticCallDefinitionAttribute att in item.CallDefinition.Attributes)
                    LogisticsTriggersCallDefinitionAttributes[item.Name].Add(new string[] { att.LogisticsKey, att.Source, att.MappedParameterName, att.Formula });
            }
        }
        {
            PDSFConfigurationDataCollectionStopTriggersDCP item = configuration.DataCollection.StopTriggers.DCP;
            if (item is not null)
                StopTriggersDCP.Add(new string[] { item.Name, item.Rule, item.ResolveGlobalVariableBeforeTrigger.ToString(), item.ResetGlobalVariablesAfterTrigger.ToString() });
        }
    }

}