//public static string RunCalculationGetSummary(int projectId)
        //{
        //    var potController = new MappedObjectController();
        //    potController.createDamageExtent(projectId);

        //    return GetSummary(projectId);
        //}

        public static ProjectResult ComputeResult(int projectId, bool details = false)
        {
            var           _controller = new DamageExtentController();
            ProjectResult _result     = _controller.computeProjectResult(projectId, details);

            return(_result);
        }
        /// <summary>
        /// Delete all damage extents of this project in database and recreate them
        /// </summary>
        /// <param name="projectId"></param>
        /// <returns></returns>
        public void createDamageExtent(int projectId)
        {
            Stopwatch _stopWatch = new Stopwatch();

            _stopWatch.Start();

            //DBManager.NewSession(); //bac session

            //ConcurrentBag<DamageExtent> _saveDamageExtents = new ConcurrentBag<DamageExtent>();
            List <DamageExtent> _saveDamageExtents = new List <DamageExtent>();

            var _damageExtentController = new DamageExtentController();

            _damageExtentController.deleteDamageExtentsFromDB(projectId);  //DELETE

            var         _hazards       = ActiveSession.QueryOver <NatHazard>().List <NatHazard>();
            var         _ikClasses     = ActiveSession.QueryOver <IKClasses>().List <IKClasses>();
            List <bool> _beforeActions = new List <bool>()
            {
                true, false
            };

            Logging.warn($"querying: elapsed time = " + _stopWatch.Elapsed.ToString());
            _stopWatch.Restart();

            var _damagePotentialController   = new MappedObjectController();
            var _allAffectedDamagePotentials = _damagePotentialController.getAllDamagePotentials(projectId); //unprocessed Damage Potentials in the project perimeter

            Logging.warn($"getAllDamagePotentials: elapsed time = " + _stopWatch.Elapsed.ToString() + $", count= {_allAffectedDamagePotentials.Count()}");
            _stopWatch.Restart();

            foreach (var hazard in _hazards)
            {
                foreach (var period in _ikClasses)
                {
                    foreach (var beforeAction in _beforeActions)
                    {
                        _stopWatch.Restart();

                        var _controller = new IntensityController();

                        List <Intensity>    _intensities = _controller.getIntensityMap(projectId, hazard.ID, period.ID, beforeAction);
                        List <MappedObject> _allProcessedDamagePotentials = new List <MappedObject>();

                        Logging.warn($"getIntensityMap: elapsed time = " + _stopWatch.Elapsed.ToString());
                        _stopWatch.Restart();

                        if (_intensities == null || _intensities.Count() == 0)
                        {
                            continue;
                        }
                        Stopwatch _damageWatch = new Stopwatch();
                        _damageWatch.Start();

                        // gather all processed DamagePotentials
                        foreach (var intensity in _intensities)
                        {
                            _damageWatch.Restart();

                            IList <MappedObject> dpListWithin = _damagePotentialController.getDamagePotentialsWithin(intensity, _allAffectedDamagePotentials);
                            List <MappedObject>  outlist      = dpListWithin.ToList();

                            Logging.warn($">getDamagePotentialsWithin: elapsed time = " + _damageWatch.Elapsed.ToString());
                            _damageWatch.Restart();

                            //IList<MappedObject> dpListWithin2 = _damagePotentialController.getDamagePotentialsWithin2(intensity, projectId);
                            //List<MappedObject> outlist = dpListWithin2.ToList();
                            //Logging.warn($">getDamagePotentialsWithin2: elapsed time = " + _damageWatch.Elapsed.ToString());
                            //_damageWatch.Restart();

                            IList <MappedObject> dpListCrossing = _damagePotentialController.getDamagePotentialCrossing(intensity, _allAffectedDamagePotentials);
                            outlist.AddRange(dpListCrossing); //Merge Within and Crossing for Intensity

                            Logging.warn($">getDamagePotentialCrossing: elapsed time = " + _damageWatch.Elapsed.ToString());
                            _damageWatch.Restart();

                            //IList<MappedObject> dpListCrossing2 = _damagePotentialController.getDamagePotentialCrossing2(intensity, projectId);
                            //outlist.AddRange(dpListCrossing2); //Merge Within and Crossing for Intensity
                            //Logging.warn($">getDamagePotentialCrossing2: elapsed time = " + _damageWatch.Elapsed.ToString());
                            //_damageWatch.Restart();

                            _allProcessedDamagePotentials.AddRange(outlist); //collect all processed DamagePotentials
                        }
                        _damageWatch.Stop();

                        Logging.warn($"getDamagePotential: elapsed time = " + _stopWatch.Elapsed.ToString());
                        _stopWatch.Restart();

                        //Parallel.ForEach(_intensities,
                        //    (intensity) =>
                        //    {

                        foreach (var intensity in _intensities)
                        {
                            var outlist = _allProcessedDamagePotentials.Where(o => o.Intensity.ID == intensity.ID).ToList();

                            List <DamageExtent> outDamageExtents = new List <DamageExtent>();
                            //ConcurrentBag<DamageExtent> outDamageExtents = new ConcurrentBag<DamageExtent>();

                            //Parallel.ForEach(outlist, (damagePotential) =>
                            //{

                            foreach (MappedObject damagePotential in outlist)
                            {
                                DamageExtent damageExtent = null;

                                damageExtent = DamageExtentController.computeDamageExtent(damagePotential, intensity);

                                if (damageExtent != null)
                                {
                                    outDamageExtents.Add(damageExtent);
                                }
                            }
                            //});

                            _saveDamageExtents.AddRange(outDamageExtents);
                            //_saveDamageExtents.AddRange<DamageExtent>(outDamageExtents);

                            //double _sumPersonDamage = outDamageExtents.Sum(x => x.PersonDamage);
                            //double _sumDeaths = outDamageExtents.Sum(x => x.Deaths);
                            //double _sumProptertyDamage = outDamageExtents.Sum(x => x.PropertyDamage);

                            //Logging.warn($"  #DamageExtent: {outlist.Count}");
                        } //loop over intensities
                          //});

                        Logging.warn($"computeDamageExtent: elapsed time = " + _stopWatch.Elapsed.ToString());
                        _stopWatch.Restart();
                    } //loop over actions
                }     //loop over period
            }         //loop over hazard

            Logging.warn($"inbetween: elapsed time = " + _stopWatch.Elapsed.ToString());
            _stopWatch.Restart();

            //one time saving to db <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            _damageExtentController.saveDamageExtentToDB(_saveDamageExtents.ToList()); //SAVE

            Logging.warn($"saveDamageExtentToDB: elapsed time = " + _stopWatch.Elapsed.ToString());
            _stopWatch.Restart();

            _stopWatch.Stop();


            //Change the project to state "Calculated"
            var _resultController = new ResultController();

            _resultController.setProjectStatus(projectId, 2);
        }