<?php

class Course extends Eloquent
{

  protected $fillable = array('name', 'code', 'number', 'section', 'program_id', 'user_id', 'semester_id');

  public function program()
  {
    return $this->belongsTo('Program');
  }

  public function students()
  {
    return $this->belongsToMany('Student')->orderBy('name', 'asc')->withTimestamps();
  }

  public function user()
  {
    return $this->belongsTo('User')->orderBy('surnames', 'asc')->orderBy('first_name', 'asc');
  }

  // TODO: Remove
  public function activities()
  {
    return $this->hasMany('Activity')->orderBy('date', 'asc');
  }

  public function activity()
  {
    return $this->belongsTo('Activity');
  }

  public function assessedActivities()
  {
    // return $this->hasMany('Activity')->whereNotNull('activities.outcomes_attempted')->orderBy('date', 'asc');
    $activitiesAssessed = DB::table('activities')
      ->join('activity_criterion as ac', 'ac.activity_id', '=', 'activities.id')
      ->join('assessments', 'assessments.activity_criterion_id', '=', 'ac.id')
      ->where('activities.course_id', $this->id)
      ->select('activities.id')
      ->distinct()
      ->lists('activities.id');
    Log::info($activitiesAssessed);

    return $this->hasMany('Activity')->whereIn('activities.id', $activitiesAssessed)->orderBy('date', 'asc');

    //    return $this->hasMany('Activity')->where('activities.draft', 0)->orderBy('date', 'asc');
  }

  public function publishedActivities()
  {
    $activitiesAssessed = DB::table('activities')
      ->join('activity_criterion as ac', 'ac.activity_id', '=', 'activities.id')
      ->join('assessments', 'assessments.activity_criterion_id', '=', 'ac.id')
      ->where('activities.course_id', $this->id)
      ->where('activities.draft', 0)
      ->select('activities.id')
      ->distinct()
      ->lists('activities.id');
    //return $this->hasMany('Activity')->whereNotNull('activities.outcomes_attempted')->where('activities.draft', 0)->orderBy('date', 'asc');
    return  $this->hasMany('Activity')->whereIn('activities.id', $activitiesAssessed)->orderBy('date', 'asc');
  }

  public function outcomes_attempted()
  {
    return DB::table('courses')
      ->join('activities', 'activities.course_id', '=', 'courses.id')
      ->join('activity_criterion', 'activity_criterion.activity_id', '=', 'activities.id')
      ->join('criteria', 'activity_criterion.criterion_id', '=', 'criteria.id')
      ->join('criterion_objective_outcome', 'criterion_objective_outcome.criterion_id', '=', 'criteria.id')
      ->where('courses.id', '=', $this->id)
      ->select('criterion_objective_outcome.outcome_id')
      ->distinct()
      ->orderBy('criterion_objective_outcome.outcome_id')
      ->get();

    //   	SELECT distinct cr.outcome_id FROM  courses c, activities a, activity_criterion ac, criteria cr WHERE c.id=a.course_id and a.id=ac.activity_id and ac.criterion_id=cr.id and c.id=1
    // 	return $this->id;
  }
  public function outcomes_att()
  {
    $criteria_attempted = DB::table('courses')
      ->join('activities', 'activities.course_id', '=', 'courses.id')
      ->join('activity_criterion', 'activities.id', '=', 'activity_criterion.activity_id')
      ->select('criterion_id', 'activity_criterion.id as activity_criterion_id')
      ->where('courses.id', $this->id)
      ->where('draft', 0)
      ->get();

    // Old data was formed like { "outcome1": cuantity_of_criteria_associated, "outcome2":cuantity_of_criteria}
    $outcomes_attempted = [];



    foreach ($criteria_attempted as $criterion) {
      $outcomes = DB::table('criterion_objective_outcome')
        ->where('criterion_id', $criterion->criterion_id)
        ->select('outcome_id')
        ->distinct()
        ->lists('outcome_id');

      foreach ($outcomes as $outcome_id) {
        if (array_key_exists($outcome_id, $outcomes_attempted)) $outcomes_attempted[$outcome_id] += 1;
        else $outcomes_attempted[$outcome_id] = 1;
      }
    }

    return $outcomes_attempted;
  }

  public function outcomes_ach()
  {
    $criteria = DB::table('criteria')
      ->join('activity_criterion', 'activity_criterion.criterion_id', '=', 'criteria.id')
      ->join('activities', 'activity_criterion.activity_id', '=', 'activities.id')
      ->join('rubric_activity', 'rubric_activity.activity_id', '=', 'activities.id')
      ->join('rubrics', 'rubrics.id', '=', 'rubric_activity.rubric_id')
      ->join('courses', 'activities.course_id', '=', 'courses.id')
      ->join('criterion_objective_outcome', 'criterion_objective_outcome.criterion_id', '=', 'criteria.id')
      ->where('courses.id', '=', $this->id)
      ->where('activities.draft', 0)
      ->select(
        'criteria.id',
        'rubrics.expected_percentage as expected_percentage_students_achieving'/*'expected_percentage_students_achieving',*/,
        'activity_criterion.activity_id'
      )
      ->distinct()
      ->get();
    // Old data was formed like { "outcome1": cuantity_of_criteria_associated_passed, "outcome2":cuantity_of_criteria}

    $outcomes_achieved = [];

    foreach ($criteria as $criterion) {
      $students_attempted = Criterion::students_attempted($criterion->id, $criterion->activity_id);
      $students_achieved = Criterion::students_achieved($criterion->id, $criterion->activity_id);

      if ($students_attempted) {
        $percentage_students_who_achieved = 100.0 * $students_achieved / $students_attempted;
      } else {
        $percentage_students_who_achieved = 0;
      }
      if ($percentage_students_who_achieved >= $criterion->expected_percentage_students_achieving) {
        $outcomes = DB::table('criterion_objective_outcome')
          ->where('criterion_id', $criterion->id)
          ->select('outcome_id')
          ->distinct()
          ->lists('outcome_id');
        foreach ($outcomes as $outcome_id) {
          if (array_key_exists($outcome_id, $outcomes_achieved)) $outcomes_achieved[$outcome_id] += 1;
          else $outcomes_achieved[$outcome_id] = 1;
        }
      }
    }
    return $outcomes_achieved;
  }

  public function someSectionAssessed()
  {
    $all_sections = DB::table('courses')
      ->join('activities', 'activities.course_id', '=', 'courses.id')
      ->join('activity_criterion as ac', 'ac.activity_id', '=', 'activities.id')
      ->join('assessments', 'assessments.activity_criterion_id', '=', 'ac.id')
      ->where('courses.name', $this->name)
      ->where('code', $this->code)
      ->where('number', $this->number)
      ->where('semester_id', $this->semester_id)
      ->where(
        'program_id',
        $this->program_id
      )
      ->where('activities.draft', 0)
      ->groupBy('courses.id')
      ->count();

    return $all_sections;
  }



  public function outcomes_achieved()
  {
    $criteria = DB::table('criteria')
      ->join('activity_criterion', 'activity_criterion.criterion_id', '=', 'criteria.id')
      ->join('activities', 'activity_criterion.activity_id', '=', 'activities.id')
      ->join('rubric_activity', 'rubric_activity.activity_id', '=', 'activities.id')
      ->join('rubrics', 'rubrics.id', '=', 'rubric_activity.rubric_id')
      ->join('courses', 'activities.course_id', '=', 'courses.id')
      ->join('criterion_objective_outcome', 'criterion_objective_outcome.criterion_id', '=', 'criteria.id')
      ->where('courses.id', '=', $this->id)
      ->select(
        'criteria.id',
        'rubrics.expected_percentage as expected_percentage_students_achieving'/*'expected_percentage_students_achieving',*/,
        'activity_criterion.activity_id'
      )
      ->distinct()
      ->get();

    $conteo = 0;
    foreach ($criteria as $criterion) {
      $students_attempted = Criterion::students_attempted($criterion->id, $criterion->activity_id);
      $students_achieved = Criterion::students_achieved($criterion->id, $criterion->activity_id);

      if ($students_attempted) {
        $percentage_students_who_achieved = 100.0 * $students_achieved / $students_attempted;
      } else {
        $percentage_students_who_achieved = 0;
      }
      if ($percentage_students_who_achieved >= $criterion->expected_percentage_students_achieving) {
        $conteo++;
      }
    }
    return $conteo;
  }

  public function semester()
  {
    return $this->belongsTo('Semester');
  }

  public function sectionsWithOutcome($outcome_id)
  {
    return Course::has('activities')->with(array('activities' => function ($query) use (&$outcome_id) {
      $query->where('outcomes_attempted', 'not like', '\'%"' . $outcome_id . '":0%\'');
    }))->where('code', $this->code)->where('number', $this->number)->get();
  }
}