<?php

class CourseAdminController extends Nmc_Controller_Action
{
    public function __construct()
    {
        $this->_registerPlugin(new Nmc_Controller_Action_Plugin_Authorize());
    }

    public function authorize()
    {
        if(!Nmc_Registry_Session::getInstance()->userName) {
            return false;
        }
        return true;
    }

    public function indexAction()
    {
        $in = new Zend_Filter_Input($this->_action->getParams());
        $uriParams = $this->_action->getParams();
        $uriParams = $uriParams['URI_PARAMS'];

        $out = new Nmc_View_Unl();
        if(Zend_Filter::isInt($uriParams[0])) {
            $course = CourseGenerations::getInstance()->find($uriParams[0]);
            $crosslisting = $course->crosslistings[0];
        } else {
            $crosslisting = CourseCrosslistings::fetchBySubjectNumberLetter($uriParams[0], $uriParams[1], $uriParams[2]);
        }
        if(!$crosslisting) {
            $course = CourseGenerations::getInstance()->fetchNew();
        } else {
            $course = $crosslisting->getParentCourse();

            if($nextCourse = $crosslisting->getNextAlphabetically()) {
                $nextCourse = $nextCourse->getParentCourse();
                $nextCourseLink = '/' . $nextCourse->subject . '/' . $nextCourse->courseNumber . '/' . $nextCourse->courseLetter;
                if($nextCourse->subject != $course->subject || $nextCourse->getPrimaryKey() == $course->getPrimaryKey()) {
                    foreach($nextCourse->crosslistings as $crosslisting) {
                        if($crosslisting->subject == $course->subject) {
                            $nextCourseLink = '/' . $crosslisting->subject . '/' . $crosslisting->courseNumber . '/' . $crosslisting->courseLetter;
                            break;
                        }
                    }
                }
            }

            if($prevCourse = $crosslisting->getPreviousAlphabetically()) {
                $prevCourse = $prevCourse->getParentCourse();
                $prevCourseLink = '/' . $prevCourse->subject . '/' . $prevCourse->courseNumber . '/' . $prevCourse->courseLetter;
                if($prevCourse->subject != $course->subject || $prevCourse->getPrimaryKey() == $course->getPrimaryKey()) {
                    foreach($prevCourse->crosslistings as $crosslisting) {
                        if($crosslisting->subject == $course->subject) {
                            $prevCourseLink = '/' . $crosslisting->subject . '/' . $crosslisting->courseNumber . '/' . $crosslisting->courseLetter;
                            break;
                        }
                    }
                }
            }

            $out->assign('prevCourseLink', $prevCourseLink);
            $out->assign('nextCourseLink', $nextCourseLink);

        }
        $creditsSingleValues = array();
        foreach($course->credits as $credit) {
            if($credit->type == 1) {
                $creditsSingleValues[] = $credit->hours;
            } else if($credit->type == 2) {
                $out->creditsRangeMin = $credit->hours;
            } else if($credit->type == 3) {
                $out->creditsRangeMax = $credit->hours;
            } else if($credit->type == 4) {
                $out->creditsMaxPerSemester = $credit->hours;
            } else if($credit->type == 5) {
                $out->creditsMaxPerDegree = $credit->hours;
            }
        }
        $out->creditsSingleValues = implode(' ', $creditsSingleValues);

        $out->assign('page', 'edit_course');
        $out->assign('course', $course);
        $out->assign('uriParams', $uriParams);
        echo $out->render();
    }

    public function updateCourseAction() {
        $uriParams = $this->_action->getParams();
        $uriParams = $uriParams['URI_PARAMS'];

        $course = CourseGenerations::getInstance()->find($_POST['courseId']);
        if(!$course) {
            $course = CourseGenerations::getInstance()->fetchNew();
            $course->type = 'official';
        }

        foreach($_POST as $key => $val) {
            if(!is_array($val) && $key != 'courseId' /*&& $val != ''*/) {
                //echo '$course->' . $key . ' = ' . $val . "<br />\n";
                $course->$key = $val;
            }
        }

        foreach($_POST as $key => $val) {
            if($key == 'credits') {
                $credits = $course->credits;
                foreach($credits as $key => $credit) {
                    unset($credits[$key]);
                }
                foreach($val as $type => $hours) {
                    if($type == 1) {
                        foreach(explode(' ', $hours) as $singeValue) {
                            if(Zend_Filter::getDigits($hours) != '') {
                                $newAttribute = CourseCredits::getInstance()->fetchNew();
                                $newAttribute->type = $type;
                                $newAttribute->hours = $singeValue;
                                $credits[] = $newAttribute;
                            }
                        }
                        continue;
                    }
                    if(Zend_Filter::getDigits($hours) != '') {
                        $newAttribute = CourseCredits::getInstance()->fetchNew();
                        $newAttribute->type = $type;
                        $newAttribute->hours = $hours;
                        $credits[] = $newAttribute;
                    }
                }
            } else if(in_array($key, array('termsOffered','deliveryMethods','campuses'))) {
                $course->$key = $val;
                //echo '$course->' . $key . ' = '; print_r($val); echo "<br />\n";
            } else if($key == 'gradTieIn') {
                if(!$course->gradTieIn instanceof CourseGradTieIn) {
                    $course->gradTieIn = CourseGradTieIns::getInstance()->fetchNew();
                }
                foreach($val as $key2 => $val2) {
                    $course->gradTieIn->$key2 = $val2;
                    //echo '$course->gradTieIn->' . $key2 . ' = ' . $val2 . "\n";
                }
            } else if(is_array($val)) {
                $array = $course->$key;
                foreach($array as $key2 => $row) {
                    unset($array[$key2]);
                }
                foreach($val as $key2 => $val2) {
                    if($val2['delete'] == 'yes') {
                        continue;
                    }
                    $attributeTable = call_user_func(array('Course' . $key, 'getInstance'));
                    $currentAttribute = $attributeTable->fetchNew();
                    unset($val2['delete']);

                    //loop over each attribute and set
                    foreach($val2 as $key3 => $val3) {
                        if($val3 == '') {
                            $val3 = null;
                        }
                        //echo '$currentAttribute->' . $key3 . ' = ' . $val3 . "<br />\n";
                        $currentAttribute->$key3 = $val3;
                    }
                    $array[] = $currentAttribute;
                    //save changes
                }
                //print_r($array);
            }
        }

        $course->save();

        $out = new Nmc_View();
        $out->refresh = '/courseadmin/index/' . $course->getPrimaryKey();
        echo $out->render();
    }

    public function deleteCourseAction()
    {
        $in = $this->_action->getParams();
        $courseId = Zend_Filter::getInt($in['URI_PARAMS'][0]);

        if($courseId > 0) {
            $course = CourseGenerations::getInstance()->find($courseId);
            $course->delete();
        }

        $out = new Nmc_View();
        $out->refresh = '/courseadmin/index/' . $courseId;
        echo $out->render();
    }

    public function otherAction()
    {
        echo "DO NOT RUN!!!";
        return;

        header('Content-type: text/plain');

        $localDB = Zend::registry('db');
        $remoteDB = Zend_Db::factory('pdoMysql',
                                     array('username' => 'creq',
                                           'password' => 'UrBJtMyvbEJ8KYzp',
                                           'dbname' => 'ugrad_curriculum_request'));

        $sql = 'SELECT * FROM creq_current_courses';
        $data = $remoteDB->fetchAll($sql);

        foreach($data as $row)
        {
            $course = array();
            $course['activities'] = array();
            $course['terms_offered'] = array();
            $course['delivery_methods'] = array();
            $course['credits'] = array();
            $course['campuses'] = array();

            $sql = 'SELECT id FROM creq_colleges WHERE description=?';
            $course['college_id'] = $localDB->fetchOne($localDB->quoteInto($sql, $row['college']));
            $act = explode(',', trim($row['activities']));
            $act2 = explode(',', trim($row['course_act']));
            if($act[0] != '') {
                foreach($act as $a) {
                    $course['activities'][$a] = '';
                }
            }
            /*
            if($act2[0] != '') {
                foreach($act2 as $a)
                {
                    preg_match('/([a-zA-Z]*)[^0-9]*([0-9]*)/', $a, $matches);
                    $key = strtoupper($matches[1]);
                    if($key != '') {
                        $course['activities'][$key] = $matches[2];
                    }
                }
            }
            */

            $terms = explode(',', trim($row['term_taught']));
            if($terms[0] != '') {
                $course['terms_offered'] = $terms;
            }

            if($row['df_removal'] != '') {
                $course['df_removal'] = $row['df_removal'];
            }

            if($row['delivery_method'] != '') {
                $course['delivery_methods'] = explode(',', $row['delivery_method']);
            }

            if($row['course_credit'] != '') {
                preg_match('/([0-9]*)(-[0-9]*)?[^m]*(max [0-9]*)?/', $row['course_credit'], $matches);
                $course['credits'] = array();
                if($matches[1] != '' && $matches[2] == '') {
                    $course['credits']['single'] = $matches[1];
                } else if($matches[1] != '' && $matches[2] != '') {
                    $course['credits']['range_min'] = $matches[1];
                }
                if($matches[2] != '') {
                    $course['credits']['range_max'] = substr($matches[2], 1);
                }
                if($matches[3] != '') {
                    $course['credits']['max'] = substr($matches[3], 3);
                }
            }

            if($row['course_title'] != '') {
                $course['title'] = $row['course_title'];
            }
            if($row['course_num'] != '') {
                $course['course_num'] = $row['course_num'];
                preg_match('/([a-zA-Z]*)[^0-9a-zA-Z]*(([0-9]*)([a-zA-Z]*))(\/([0-9]*)([a-zA-Z]*))?/', $row['course_num'], $matches);
                if($matches[1] != '') {
                    $course['subject'] = $matches[1];
                }
                if($matches[3] != '') {
                    $course['number'] = $matches[3];
                }
                if($matches[4] != '') {
                    $course['letter'] = $matches[4];
                }
                if($matches[6] != '') {
                    $course['alt_num'] = $matches[6];
                }
                if($matches[7] != '') {
                    $course['alt_letter'] = $matches[7];
                }
            }

            if($row['course_prereq'] != '') {
                $course['prerequisite'] = $row['course_prereq'];
            }

            if($row['course_note'] != '') {
                $course['notes'] = $row['course_note'];
            }

            if($row['course_desc'] != '') {
                $course['description'] = $row['course_desc'];
            }

            if($row['course_inst'] != '') {
                $course['campuses'] = explode(',', $row['course_inst']);
            }

            if($row['parent_xlist'] != '') {
                $course['parent_course'] = array();
                preg_match('/([a-zA-Z]*)([0-9]*)([a-zA-Z]*)/', $row['parent_xlist'], $matches);
                if($matches[1] != '') {
                    $course['parent_course']['subject'] = $matches[1];
                }
                if($matches[2] != '') {
                    $course['parent_course']['number'] = $matches[2];
                }
                if($matches[3] != '') {
                    $course['parent_course']['letter'] = $matches[3];
                }


                if(   $course['parent_course']['subject'] == $course['subject']
                   && $course['parent_course']['number'] == $course['number']
                   && $course['parent_course']['letter'] == $course['letter']) {
                    $parent_courses[] = $course;
                } else {
                    $crosslisted_courses[] = $course;
                }
            } else {
                $parent_courses[] = $course;
            }
        }

        $localDB->beginTransaction();
        foreach($parent_courses as $course) {
            try {
                try {
                    $sql = 'INSERT INTO creq_subjects(short_name) VALUES(?)';
                    $localDB->query($sql, array($course['subject']));
                } catch(Exception $e) {
                    //do nothing
                }

                $sql = 'INSERT INTO creq_courses() VALUES()';
                $localDB->query($sql);
                $courseId = $localDB->lastInsertId();

                $sql = 'INSERT INTO creq_course_generations(course, title, subject, course_number, course_letter, prerequisite, notes, description) '
                     . 'VALUES(?, ?, ?, ?, ?, ?, ?, ?)';
                $localDB->query($sql, array($courseId,
                                            $course['title'],
                                            $course['subject'],
                                            $course['number'],
                                            $course['letter'],
                                            $course['prerequisite'],
                                            $course['notes'],
                                            $course['description']));
                $generationId = $localDB->lastInsertId();

                $sql = 'UPDATE creq_courses SET current_generation=? WHERE id=?';
                $localDB->query($sql, array($generationId, $courseId));

                if($course['alt_num'] != '') {
                    $sql = 'INSERT INTO creq_course_crosslistings(parent_course, subject, course_number, course_letter) '
                         . 'VALUES(?, ?, ?, ?)';
                    $localDB->query($sql, array($generationId,
                                                $course['subject'],
                                                $course['alt_num'],
                                                $course['alt_letter']));
                }

                foreach($course['activities'] as $activity => $hours) {
                    $sql = 'INSERT INTO creq_course_activities(course_generation, type, credits) '
                         . 'VALUES(?, ?, ?)';
                    $localDB->query($sql, array($generationId,
                                                strtolower($activity),
                                                $hours));
                }
                foreach($course['campuses'] as $campus) {
                    $sql = 'INSERT INTO creq_course_campuses(course_generation, campus) '
                         . 'VALUES(?, ?)';
                    $localDB->query($sql, array($generationId,
                                                $campus));
                }
                foreach($course['credits'] as $type => $hours) {
                    if($type == 'single') {
                        $type = 1;
                    } else if($type == 'range_min') {
                        $type = 2;
                    } else if($type == 'range_max') {
                        $type = 3;
                    } else if($type == 'max') {
                        $type = 4;
                    }
                    $sql = 'INSERT INTO creq_course_credits(course_generation, type, hours) '
                         . 'VALUES(?, ?, ?)';
                    $localDB->query($sql, array($generationId,
                                                $type,
                                                $hours));
                }
                foreach($course['delivery_methods'] as $method) {
                    if($method == 'classroom') {
                        $method = 1;
                    } else if($method == 'web') {
                        $method = 2;
                    }
                    $sql = 'INSERT INTO creq_course_delivery_methods(course_generation, delivery_method) '
                         . 'VALUES(?, ?)';
                    $localDB->query($sql, array($generationId,
                                                $method));
                }
                foreach($course['terms_offered'] as $term) {
                    if($term == 'I') {
                        $term = 1;
                    } else if($term == 'II') {
                        $term = 2;
                    } else if($term == 'III') {
                        $term = 3;
                    }
                    $sql = 'INSERT INTO creq_course_terms_offered(course_generation, term) '
                         . 'VALUES(?, ?)';
                    $localDB->query($sql, array($generationId,
                                                $term));
                }
            } catch(Exception $e) {
                echo $i++ . ' ' . $e->getMessage() . "\n";
                //do nothing
            }
        }
        foreach($crosslisted_courses as $course) {
            try {
                try {
                    $sql = 'INSERT INTO creq_subjects(short_name) VALUES(?)';
                    $localDB->query($sql, array($course['subject']));
                } catch(Exception $e) {
                    //do nothing
                }

                if(isset($course['parent_course'])) {
                    $sql = 'SELECT b.id FROM creq_courses AS a JOIN creq_course_generations AS b ON(a.current_generation = b.id) '
                         . 'WHERE subject=? AND course_number=? AND (course_letter=? OR ISNULL(course_letter))';
                    $parent_course_id = $localDB->fetchOne($sql, array($course['parent_course']['subject'],
                                                                       $course['parent_course']['number'],
                                                                       $course['parent_course']['letter']));
                    $sql = 'INSERT INTO creq_course_crosslistings(parent_course, subject, course_number, course_letter) '
                         . 'VALUES(?, ?, ?, ?)';
                    $localDB->query($sql, array($parent_course_id, $course['subject'], $course['number'], $course['letter']));
                    if($course['alt_num'] != '') {
                        $localDB->query($sql, array($parent_course_id, $course['subject'], $course['alt_num'], $course['alt_letter']));
                    }
                }
            } catch(Exception $e) {
                echo $i++ . ' ' . $e->getMessage() . "\n";
                //do nothing
            }
        }
        //$localDB->rollBack();
        $localDB->commit();
    }

}