/// <summary>
 /// Initializes a new instance of the <see cref="LocalCalculationController"/> class.
 /// </summary>
 public LocalCalculationController()
     : base("Local calculation")
 {
     db = new LibiadaWebEntities();
     commonSequenceRepository = new CommonSequenceRepository(db);
     characteristicTypeLinkRepository = new CharacteristicTypeLinkRepository(db);
 }
        public ActionResult Index(
            long[] matterIds,
            int[] characteristicTypeLinkIds,
            int[] notationIds,
            int[] languageIds,
            int?[] translatorIds,
            bool rotate,
            bool complementary,
            uint? rotationLength)
        {
            return Action(() =>
                {
                    var sequencesCharacteristics = new SequenceCharacteristics[matterIds.Length];
                    var characteristicNames = new string[characteristicTypeLinkIds.Length];
                    var characteristicsList = new SelectListItem[characteristicTypeLinkIds.Length];
                    var links = new Link[characteristicTypeLinkIds.Length];
                    var calculators = new IFullCalculator[characteristicTypeLinkIds.Length];
                    Dictionary<long, string> mattersNames;
                    double[][] characteristics;
                    Chain[][] chains;

                    using (var db = new LibiadaWebEntities())
                    {
                        mattersNames = db.Matter.Where(m => matterIds.Contains(m.Id)).ToDictionary(m => m.Id, m => m.Name);

                        var commonSequenceRepository = new CommonSequenceRepository(db);
                        chains = commonSequenceRepository.GetChains(matterIds, notationIds, languageIds, translatorIds);

                        var characteristicTypeLinkRepository = new CharacteristicTypeLinkRepository(db);
                        for (int k = 0; k < characteristicTypeLinkIds.Length; k++)
                        {
                            links[k] = characteristicTypeLinkRepository.GetLibiadaLink(characteristicTypeLinkIds[k]);
                            string className = characteristicTypeLinkRepository.GetCharacteristicType(characteristicTypeLinkIds[k]).ClassName;
                            calculators[k] = CalculatorsFactory.CreateFullCalculator(className);
                            characteristicNames[k] = characteristicTypeLinkRepository.GetCharacteristicName(characteristicTypeLinkIds[k], notationIds[k]);
                            characteristicsList[k] = new SelectListItem
                            {
                                Value = k.ToString(),
                                Text = characteristicNames[k],
                                Selected = false
                            };
                        }
                    }

                    if (!rotate && !complementary)
                    {
                        characteristics = SequencesCharacteristicsCalculator.Calculate(chains, calculators, links, characteristicTypeLinkIds);
                    }
                    else
                    {
                        characteristics = SequencesCharacteristicsCalculator.Calculate(chains, calculators, links, rotate, complementary, rotationLength);
                    }

                    for (int i = 0; i < matterIds.Length; i++)
                    {
                        sequencesCharacteristics[i] = new SequenceCharacteristics
                        {
                            MatterName = mattersNames[matterIds[i]],
                            Characteristics = characteristics[i]
                        };
                    }

                    var result = new Dictionary<string, object>
                                            {
                                                    { "characteristics", sequencesCharacteristics },
                                                    { "characteristicNames", characteristicNames },
                                                    { "characteristicsList", characteristicsList }
                                            };

                    return new Dictionary<string, object>
                           {
                               { "data", JsonConvert.SerializeObject(result) }
                           };
                });
        }