/*  private void Fight(Camp campFighting)
         * {
         *    Camp.JungleMinion minHpMin = campFighting.Minions.OrderBy(cp => cp.UpdatedStats.health).First();
         *    Camp.JungleMinion maxHpMin = campFighting.Minions.OrderByDescending(cp => cp.UpdatedStats.health).First();
         *
         *    Console.WriteLine("Minion count: " + maxHpMin.UpdatedStats.health);
         *
         *    float heroAoeDps = heroFigher.getSkillAoePerSec();
         *    float heroDps = heroFigher.getDPS(campFighting);
         *
         *    Console.WriteLine("Hero dps:" + heroDps);
         *
         *    float timeToKIllMin = heroFigher.getTimeToDoDmgAoe(minHpMin, minHpMin.UpdatedStats.health, (campFighting.timeToCamp - 3) < 0 ? 0 : campFighting.timeToCamp - 3);
         *    float timeToKIllMax = heroFigher.getTimeToDoDmg(maxHpMin, maxHpMin.UpdatedStats.health, (campFighting.timeToCamp - 3) < 0 ? 0 : campFighting.timeToCamp - 3);
         *
         *    float fullCampDps = campFighting.Minions.Sum(min => min.getDps());
         *
         *    float fullDmgDoneToMe = 0;
         *
         *    float timeToFinish = 0;
         *
         *    //Much aoe
         *    if (timeToKIllMin < timeToKIllMax)
         *    {
         *        Console.WriteLine("Aeo better");
         *        fullDmgDoneToMe += timeToKIllMin*fullCampDps;
         *        float restTimeToKill = timeToKIllMax - timeToKIllMin;
         *        fullDmgDoneToMe += restTimeToKill * maxHpMin.getDps() * heroFigher.getKrugBuffDmgRemove(campFighting.timeToCamp, timeToKIllMax);
         *        timeToFinish += timeToKIllMin+restTimeToKill;
         *    }
         *    else
         *    {
         *        Console.WriteLine("Single dps better: " + maxHpMin.UpdatedStats.health);
         *        fullDmgDoneToMe += timeToKIllMax * fullCampDps;
         *        float dmgDoneAor = timeToKIllMax*heroAoeDps;
         *        float leftMin = campFighting.Minions.Count - 1;
         *        float leftMinHp = leftMin * (minHpMin.UpdatedStats.health - dmgDoneAor);
         *
         *        float tmeToFinish = leftMinHp/(heroAoeDps + heroDps);
         *        timeToFinish = tmeToFinish + timeToKIllMax;
         *        fullDmgDoneToMe += minHpMin.getDps()*2;
         *    }
         *
         *    Console.WriteLine("TimeTOfinish: " + timeToFinish);
         *    float myHpTillThere = heroFigher.getFulHeal((campFighting.timeToCamp - 3) < 0 ? 0 : campFighting.timeToCamp - 3, timeToFinish) + Jungler.player.Health;
         *
         *    float relDmgToMe = heroFigher.realPhysDmgDoneToMe(fullDmgDoneToMe);
         *
         *    Console.WriteLine("HpLeft: " + (myHpTillThere-relDmgToMe));
         *
         * }*/

        public bool AroundFight(Camp campFighting, bool smite = false, bool aoeSmite = false, bool smiteIfNeedTo = false)
        {
            Camp.JungleMinion minHpMin = campFighting.Minions.OrderBy(cp => cp.UpdatedStats.health).First();
            Camp.JungleMinion maxHpMin = campFighting.Minions.OrderByDescending(cp => cp.UpdatedStats.health).First();
            smite = getSmiteCd(campFighting.timeToCamp) == 0 && smite;
            // Console.WriteLine("Smite: " + smite + " dmg: " + heroFigher.getSmiteDmg());
            float maxMinHp = maxHpMin.UpdatedStats.health - ((smite) ? (heroFigher.getSmiteDmg() / 2) : 0);;
            float minMinHp = minHpMin.UpdatedStats.health - ((smite && aoeSmite)?(heroFigher.getSmiteDmg() / 2):0);

            //Console.WriteLine("Fighting: " + campFighting.ToString());

            float timeToKillMin = heroFigher.getTimeToDoDmgAoe(minHpMin, minMinHp, (campFighting.timeToCamp - 3) < 0 ? 0 : campFighting.timeToCamp - 3);
            float timeToKillMax = heroFigher.getTimeToDoDmg(maxHpMin, maxMinHp, (campFighting.timeToCamp - 3) < 0 ? 0 : campFighting.timeToCamp - 3);

            float fullCampDps = campFighting.Minions.Sum(min => min.getDps());

            float fullDmgDoneToMe = 0;

            float timeToKillCamp = 0;

            // Console.WriteLine("timeToKillMin " + timeToKillMin);
            //Console.WriteLine("timeToKillMax " + timeToKillMax);


            if (campFighting.aliveMinCount() == 1)
            {
                timeToKillCamp  = timeToKillMax;
                fullDmgDoneToMe = maxHpMin.getDps() *
                                  heroFigher.getKrugBuffDmgRemove(campFighting.timeToCamp, timeToKillMax);
            }
            else
            {
                //Good aoe
                if (timeToKillMin < timeToKillMax)
                {
                    // Console.WriteLine("Aeo better: " + timeToKillMin);
                    float restTimeToKill = timeToKillMax - timeToKillMin;
                    fullDmgDoneToMe += fullCampDps * timeToKillMin;

                    fullDmgDoneToMe += restTimeToKill * maxHpMin.getDps() * heroFigher.getKrugBuffDmgRemove(campFighting.timeToCamp, timeToKillMax);
                    timeToKillCamp   = restTimeToKill + timeToKillMin;
                }
                else
                {
                    fullDmgDoneToMe += timeToKillMax * fullCampDps;
                    float dmgDoneAor = heroFigher.getAoeDmgDoneInTime(minHpMin, timeToKillMax, campFighting.timeToCamp) + heroFigher.getFrogBuffAoe(campFighting.timeToCamp, timeToKillMin - timeToKillMax);
                    float leftMin    = campFighting.Minions.Count - 1;
                    float leftMinHp  = leftMin * (minMinHp - dmgDoneAor);

                    float tmeToFinish = heroFigher.getTimeToDoDmg(minHpMin, leftMinHp, 6);
                    timeToKillCamp   = tmeToFinish + timeToKillMax;
                    fullDmgDoneToMe += minHpMin.getDps() * tmeToFinish;
                }
            }
            // Console.WriteLine("TimeTOfinish: " + timeToKillCamp);
            float myHpTillThere = heroFigher.getFulHeal((campFighting.timeToCamp - 3) < 0 ? 0 : campFighting.timeToCamp - 3, timeToKillCamp);

            float relDmgToMe = heroFigher.realPhysDmgDoneToMe(fullDmgDoneToMe);

            // Console.WriteLine("HpLeft: " + (myHpTillThere + Jungler.player.Health - relDmgToMe) + " will heal:" + myHpTillThere);

            hpLeftAfter = (myHpTillThere + Jungler.player.Health - relDmgToMe);
            timeToKill  = timeToKillCamp;

            if (smiteIfNeedTo && hpLeftAfter <= 100 && getSmiteCd(campFighting.timeToCamp) == 0)
            {
                AroundFight(campFighting, true, aoeSmite);
                campFighting.forceSmite = true;
                //  Console.WriteLine("force smite!!!!");
            }
            //Update camp
            campFighting.willKillMe       = hpLeftAfter < 250;
            campFighting.hpLeftAfterFight = hpLeftAfter;
            campFighting.timeToKill       = timeToKill;

            return(hpLeftAfter > 250);
        }