<?php

namespace mod_timetable;

/**
 * An example of a scheduled task.
 */
class import_data {

   public function __construct() {
   }

  /**
   * Return the task's name as shown in admin screens.
   *
   * @return string
   */  

  public function get_name() {
    return get_string('import_data', 'mod_timetable');
  }

  private function update_lesson($content) {
    global $DB,$CFG;
    $filehash = get_config('timetable', 'filehash_lesson');
    $hash = md5($content);
    if ($hash == $filehash) return('Data not changed');
    $result ="";
    try {
      $transaction = $DB->start_delegated_transaction();
      $result .= "before delete\n";
      $DB->delete_records_select("timetable_lesson", "id>0");
      $result .= "after delete\n";
      foreach (preg_split('/$\R?^/m',$content) as $buffer) {
        //echo $buffer;
        $result .= "+";
        $buffer = utf8_encode(rtrim($buffer));
        $data = explode("\t", $buffer);
        if (count($data) != 10) throw new \Exception('Wrong size of elements ');
        $dataobject = (object)array('teacher' => $data[0], 
          'day'     => $data[1],
          'period'  => $data[2],
          'subject' => $data[3],
          'room'    => $data[4],
          'lessonid'=> $data[5],
          'flag'    => $data[6],
          'class'   => $data[7],
          'week'    => $data[8],
          'unknown' => $data[9]);

        $DB->insert_record("timetable_lesson", $dataobject);
      }
      $transaction->allow_commit();
      set_config('filehash_lesson', $hash, 'timetable');
    } catch(Exception $e) {
      $transaction->rollback($e);
    }
    return ($result);
  }


  private function update_substitution($content) {
    global $DB,$CFG;
    $filehash = get_config('timetable', 'filehash_substitution');
    $hash = md5($content);
    if ($hash == $filehash) return('Data not changed');
    $result ="";
    try {
      $transaction = $DB->start_delegated_transaction();
      $result .= "before delete\n";
      $DB->delete_records_select("timetable_substitution", "id>0");
      $result .= "after delete\n";
      foreach (preg_split('/$\R?^/m',$content) as $buffer) {
        $data = str_getcsv($buffer, ',');
        $dataobject = (object)array(
          'id'                  => $data[0], 
          'date'     		=> $data[1],
          'period'  		=> $data[2],
          'absence' 		=> $data[3],
          'lesson'    		=> $data[4],
          'teachera'		=> $data[5],
          'teacherb'    	=> $data[6],
          'subjecta'   		=> utf8_encode($data[7]),
          'statistica'   	=> $data[8],
          'subjectb'    	=> utf8_encode($data[9]),
          'statisticb'   	=> $data[10],
          'rooma'   		=> $data[11],
          'roomb'   		=> $data[12],
          'statisticflag'   	=> $data[13],
          'classa'   		=> utf8_encode($data[14]),
          'reason'   		=> utf8_encode($data[15]),
          'text'  	 	=> utf8_encode($data[16]),
          'type'   		=> $data[17],
          'classb'   		=> utf8_encode($data[18]),
          'substitutiontype'   	=> $data[19],
          'changetime'   	=> $data[20],
          'unknown' 		=> $data[21]);
        //echo var_dump($dataobject);
        foreach (get_object_vars($dataobject) as $key => $value) {
          if ($value=='') unset($dataobject->{$key});
        }
        $DB->insert_record_raw("timetable_substitution", $dataobject,false, false, true);
      }
      $transaction->allow_commit();
      set_config('filehash_substitution', $hash, 'timetable');
    } catch(Exception $e) {
      $transaction->rollback($e);
    }
    return $result;
  }

  private function update_teacher($content) {
    global $DB,$CFG;
    $filehash = get_config('timetable', 'filehash_teacher');
    $hash = md5($content);
    if ($hash == $filehash) return('Data not changed');
    $result = "";
    try {
      $transaction = $DB->start_delegated_transaction();
      $result .= "before delete\n";
      $DB->delete_records_select("timetable_teacher", "id>0");
      $result .= "after delete\n";
      foreach (preg_split('/$\R?^/m',$content) as $buffer) {
        $buffer = utf8_encode(rtrim($buffer));
        $data = explode("\t", $buffer);
        if (!(array_key_exists(3,$data))) {
          $data[3] = '';
        } else {
          $result .= "firstname exists: $data[3]\n";
        }
        //if (count($data) < 3) throw new Exception('Wrong size of elements');
        $dataobject = (object)array('teacher' => $data[0], 
          'surname'         => $data[1],
          'firstname'       => $data[3]);

        $DB->insert_record("timetable_teacher", $dataobject);
      }
      $transaction->allow_commit();
      set_config('filehash_teacher', $hash, 'timetable');
    } catch(Exception $e) {
      $transaction->rollback($e);
    }
    return $result;
  }

  private function update_room($content) {
    global $DB,$CFG;
    $filehash = get_config('timetable', 'filehash_room');
    $hash = md5($content);
    if ($hash == $filehash) return('Data not changed');
    $result = "";
    try {
      $transaction = $DB->start_delegated_transaction();
      $result .= "before delete\n";
      $DB->delete_records_select("timetable_room", "id>0");
      $result .= "after delete\n";
      foreach (preg_split('/$\R?^/m',$content) as $buffer) {
        $buffer = utf8_encode(rtrim($buffer));
        $data = explode("\t", $buffer);
        if (count($data) < 2) throw new \Exception('Wrong size of elements');
        $dataobject = (object)array('room'        => $data[0], 
          'description' => $data[1]);

        $DB->insert_record("timetable_room", $dataobject);
      }
      $transaction->allow_commit();
      set_config('filehash_room', $hash, 'timetable');
    } catch(Exception $e) {
      $transaction->rollback($e);
    }
    return $result;
  }

  private function update_class($content) {
    global $DB,$CFG;
    $filehash = get_config('timetable', 'filehash_class');
    $hash = md5($content);
    if ($hash == $filehash) return('Data not changed');
    $result = "";
    try {
      $transaction = $DB->start_delegated_transaction();
      $result .= "before delete\n";
      $DB->delete_records_select("timetable_class", "id>0");
      $result .= "after delete\n";
      foreach (preg_split('/$\R?^/m',$content) as $buffer) {
        $buffer = utf8_encode(rtrim($buffer));
        $data = explode("\t", $buffer);
        if (!(array_key_exists(1,$data))) $data[1] = $data[0];
        if (count($data) < 2) throw new \Exception('Wrong size of elements');
        $dataobject = (object)array('class'       => $data[0], 
          'description' => $data[1]);

        $DB->insert_record("timetable_class", $dataobject);
      }
      $transaction->allow_commit();
      set_config('filehash_class', $hash, 'timetable');
    } catch(Exception $e) {
      $transaction->rollback($e);
    }
    return $result;
  }

  private function update_absence($content) {
    global $DB,$CFG;
    $filehash = get_config('timetable', 'filehash_abs');
    $hash = md5($content);
    if ($hash == $filehash) return('Data not changed');
    $result = "";
    try {
      $transaction = $DB->start_delegated_transaction();
      $result .= "before delete\n";
      $DB->delete_records_select("timetable_absence", "id>0");
      $result .= "after delete\n";
      foreach (preg_split('/$\R?^/m',$content) as $buffer) {
        $data = str_getcsv($buffer, ',');
        $dataobject = (object)array('id' 			=> $data[0], 
          'type' 		=> $data[1], 
          'name'     		=> utf8_encode($data[2]),
          'startdate'  		=> $data[3],
          'enddate' 		=> $data[4],
          'startperiod' 	=> $data[5],
          'endperiod' 		=> $data[6],
          'reason' 		=> utf8_encode($data[7]),
          'text' 		=> utf8_encode($data[8]));
        foreach (get_object_vars($dataobject) as $key => $value) {
          if ($value=='') unset($dataobject->{$key});
        }
        $DB->insert_record("timetable_absence", $dataobject);
      }
      $transaction->allow_commit();
      set_config('filehash_abs', $hash, 'timetable');
    } catch(Exception $e) {
      $transaction->rollback($e);
    }
    return $result;
  }

  private function update_absence_reason($content) {
    global $DB,$CFG;
    $filehash = get_config('timetable', 'filehash_absreas');
    $hash = md5($content);
    if ($hash == $filehash) return('Data not changed');
    $result = "";
    try {
      $transaction = $DB->start_delegated_transaction();
      $result .= "before delete\n";
      $DB->delete_records_select("timetable_absence_reason", "id>0");
      $result .= "after delete\n";
      foreach (preg_split('/$\R?^/m',$content) as $buffer) {
        $data = str_getcsv($buffer, ',');
        $dataobject = (object)array('reason' 		=> utf8_encode($data[0]), 
          'description'     	=> utf8_encode($data[1]),
          'flag'  		=> $data[2],
          'statistic' 	=> $data[3]);
        foreach (get_object_vars($dataobject) as $key => $value) {
          if ($value=='') unset($dataobject->{$key});
        }
        $DB->insert_record("timetable_absence_reason", $dataobject);
      }
      $transaction->allow_commit();
      set_config('filehash_absreas', $hash, 'timetable');
    } catch(Exception $e) {
      $transaction->rollback($e);
    }
    return $result;
  }

  private function update_time($content) {
    global $DB,$CFG;
    $filehash = get_config('timetable', 'filehash_times');
    $hash = md5($content);
    if ($hash == $filehash) return('Data not changed');
    $result = "";
    try {
      $transaction = $DB->start_delegated_transaction();
      $result .= "before delete\n";
      $DB->delete_records_select("timetable_time", "id>0");
      $result .= "after delete\n";
      foreach (preg_split('/$\R?^/m',$content) as $buffer) {
        $buffer = utf8_encode(rtrim($buffer));
        $data = explode("\t", $buffer);
        $dataobject = (object)array('day'       => $data[0], 
          'period'    => $data[1],
          'maxperiod' => $data[2],
          'starttime' => $data[3],
          'endtime'   => $data[4]);
        $DB->insert_record("timetable_time", $dataobject);
      }
      $transaction->allow_commit();
      set_config('filehash_times', $hash, 'timetable');
    } catch(Exception $e) {
      $transaction->rollback($e);
    }
    return $result;
  }

  /**
   * Execute the task.
   */
  public function update($files) {
    global $DB,$CFG;
    $results = array();
    foreach ($files as $file) {
      $content = base64_decode($file['content']);
      $result = array();
      $result['name'] = $file['name'];
      switch ($file['name']) {
        case 'lesson':
          $result['result'] = $this->update_lesson($content);
          break;
        case 'substitution':
          $result['result'] = $this->update_substitution($content);
          break;
        case 'teacher':
          $result['result'] = $this->update_teacher($content);
          break;
        case 'class':
          $result['result'] = $this->update_class($content);
          break;
        case 'room':
          $result['result'] = $this->update_room($content);
          break;
        case 'time':
          $result['result'] = $this->update_time($content);
          break;
        case 'absence':
          $result['result'] = $this->update_absence($content);
          break;
        case 'absence_reason':
          $result['result'] = $this->update_absence_reason($content);
          break;
        default:
          $result['result'] = "no handler";
      }
      $results[] = $result;
    }
    return $results;
  }

}