/**
  *
  * STATES  FOR NORMAL ARE :
  *  0 : not started
  *  1 : Waiting for drop
  *  2 : Drop received, waiting for correction
  *  3 : Copy corrected , Evaluation end.
  *
  * STATES FOR PEERREVIEW (for X correction ):
  *  0 : notStarted
  *  1 : Waiting for drop
  *  2 : Drop received
  *  3 : Correction 1/x
  *  4 : Correction 2/X
  *  5 : Correction X/X
  *  6 : Waiting for correction
  *  7 : copy corrected, Evaluation End.
  *
  * WARNING : if a drop has the 'unlockedDrop' property, it will make the drop being at the last state.
  *  currentstate : index of the current state  in the stateArray
  *  percent : rounded progress in percent
  *  nbCorrection : corrections made by the user in this evaluation.
  *
  * @param  \Innova\CollecticielBundle\Entity\Dropzone                                     $dropzone
  * @param  \Innova\CollecticielBundle\Entity\Drop|\Innova\CollecticielBundle\Manager\Drop $drop
  * @param  int                                                                            $nbCorrection number of correction the user did.
  * @return array                                                                          (states, currentState,percent,nbCorrection)
  */
 public function getDrozponeProgress(Dropzone $dropzone, Drop $drop = null, $nbCorrection = 0)
 {
     $begin_states = array('Evaluation not started', 'awaiting for drop', 'drop provided');
     $end_states = array('waiting for correction', 'corrected copy');
     $states = array();
     $states = array_merge($states, $begin_states);
     $expectedCorrections = $dropzone->getExpectedTotalCorrection();
     $currentState = 0;
     // set the states of the dropzone.
     if ($dropzone->getPeerReview()) {
         // case of peerReview
         /*
          * --------------------- SPECIAL CASE  BEGIN ------------------------------
          *  particular case where the peerReview end whereas the user didnt
          *  had time to make all the expected corrections.
          *  so we make a hack to allow them to see their note and simulate that
          *  they did the expected corrections.
          */
         $allow_user_to_not_have_expected_corrections = $this->isPeerReviewEndedOrManualStateFinished($dropzone, $nbCorrection);
         /* --------------------- SPECIAL CASE  END ------------------------------*/
         if (!$allow_user_to_not_have_expected_corrections && $drop != null && !$drop->isUnlockedDrop()) {
             for ($i = 0; $i < $expectedCorrections; $i++) {
                 array_push($states, 'correction n°%nb_correction%/%expected_correction%');
             }
         }
         $states = array_merge($states, $end_states);
         // getting the current state.
         // if no drop, state is 0 as default.
         if (!empty($drop)) {
             $currentState++;
             if ($drop->getFinished()) {
                 $currentState++;
             }
             // @TODO manage invalidated corrections.
             //  update the state with the correction number.
             if ($nbCorrection > $expectedCorrections) {
                 $nbCorrection = $expectedCorrections;
             }
             if (!$allow_user_to_not_have_expected_corrections && !$drop->isUnlockedDrop()) {
                 $currentState += $nbCorrection;
                 if ($nbCorrection >= $expectedCorrections) {
                     $currentState++;
                 }
             } else {
                 $currentState++;
             }
             if ($drop->countFinishedCorrections() >= $expectedCorrections) {
                 $currentState++;
                 if ($allow_user_to_not_have_expected_corrections) {
                     $currentState++;
                 }
             } elseif ($drop->isUnlockedDrop()) {
                 $currentState++;
             }
             // admin case ( can correct more than expected )
             if ($currentState >= count($states)) {
                 $currentState = count($states) - 1;
             }
         }
     } else {
         // case of normal correction.
         $states = array_merge($states, $end_states);
         // if no drop, state is 0 as default.
         if (!empty($drop)) {
             $currentState++;
             if ($drop->getFinished()) {
                 $currentState += 2;
             }
             if ($drop->countFinishedCorrections() >= $expectedCorrections) {
                 $currentState++;
             }
         }
     }
     $percent = round($currentState * 100 / (count($states) - 1));
     return array('states' => $states, 'currentState' => $currentState, 'percent' => $percent, 'nbCorrection' => $nbCorrection);
 }