SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

DROP VIEW IF EXISTS view_disciplines_teachers;
DROP VIEW IF EXISTS `view_disciplines_students`;
DROP VIEW IF EXISTS `view_rating_result`;
DROP VIEW IF EXISTS view_disciplines_results;


-- todo: remove max year crutch - add return (year, groupID, ...), use view_groups
CREATE OR REPLACE VIEW `view_groups_reduced` AS
    SELECT  study_groups.ID         AS 'GroupID',
            study_groups.GroupNum   AS 'GroupNum',
            groups_years.Name       AS 'GroupName',
            grades.ID               AS 'GradeID',
            grades.Num              AS 'GradeNum',
            grades.Degree           AS 'Degree',
            specializations.ID      AS 'SpecID',
            specializations.Name    AS 'SpecName',
            specializations.Abbr    AS 'SpecAbbr',
            specializations.Code    AS 'SpecCode',
            faculties.ID        AS 'FacultyID',
            faculties.Name      AS 'FacultyName',
            faculties.Abbr      AS 'FacultyAbbr'
        FROM groups_years
        LEFT JOIN groups_years as t ON groups_years.GroupID = t.GroupID AND groups_years.Year < t.Year
        INNER JOIN study_groups ON groups_years.GroupID = study_groups.ID
        INNER JOIN `specializations` ON groups_years.SpecializationID = specializations.ID
        INNER JOIN `grades` ON study_groups.GradeID = grades.ID
        INNER JOIN `faculties` ON faculties.ID = specializations.FacultyID
        WHERE t.GroupID IS NULL;

CREATE OR REPLACE VIEW `view_groups` AS
    SELECT  study_groups.ID         AS 'GroupID',
            study_groups.GroupNum   AS 'GroupNum',
            groups_years.Name       AS 'GroupName',
            grades.ID               AS 'GradeID',
            grades.Num              AS 'GradeNum',
            grades.Degree           AS 'Degree',
            specializations.ID      AS 'SpecID',
            specializations.Name    AS 'SpecName',
            specializations.Abbr    AS 'SpecAbbr',
            specializations.Code    AS 'SpecCode',
            faculties.ID        AS 'FacultyID',
            faculties.Name      AS 'FacultyName',
            faculties.Abbr      AS 'FacultyAbbr',
            groups_years.Year
        FROM groups_years
        INNER JOIN study_groups ON groups_years.GroupID = study_groups.ID
        INNER JOIN `specializations` ON groups_years.SpecializationID = specializations.ID
        INNER JOIN `grades` ON study_groups.GradeID = grades.ID
        INNER JOIN `faculties` ON faculties.ID = specializations.FacultyID;


CREATE OR REPLACE VIEW `view_teachers` AS
    SELECT  teachers.ID         AS 'TeacherID',
            teachers.LastName,
            teachers.FirstName,
            teachers.SecondName,
            teachers.AccountID,
            job_positions.ID    AS 'JobPositionID',
            job_positions.Name  AS 'JobPositionName',
            departments.ID      AS 'DepID',
            departments.Name    AS 'DepName',
            faculties.ID        AS 'FacultyID',
            faculties.Name      AS 'FacultyName',
            faculties.Abbr      AS 'FacultyAbbr'
        FROM `teachers`
        INNER JOIN `departments`    ON  departments.ID = teachers.DepartmentID
        INNER JOIN `faculties`      ON  departments.FacultyID = faculties.ID
        INNER JOIN `job_positions`  ON  job_positions.ID = teachers.JobPositionID;


CREATE OR REPLACE VIEW `view_students` AS
    SELECT  students.ID         AS 'StudentID',
            students.LastName,
            students.FirstName,
            students.SecondName,
            students.AccountID,
            students_groups.SemesterID,
            view_groups_reduced.*
        FROM `students`
        LEFT JOIN `students_groups` ON students_groups.StudentID = students.ID
        LEFT JOIN `view_groups_reduced` ON view_groups_reduced.GroupID = students_groups.GroupID;


CREATE OR REPLACE VIEW `view_disciplines` AS
    SELECT  disciplines.ID          AS 'DisciplineID',
            disciplines.AuthorID,
            disciplines.ExamType,
            disciplines.LectureCount,
            disciplines.PracticeCount,
            disciplines.LabCount,
            disciplines.SemesterID,
            disciplines.IsLocked,
            disciplines.Milestone,
            disciplines.Subtype,
            disciplines.CompoundDiscID,
            disciplines.MaxRate,
            disciplines.CurRate,
            grades.ID               AS 'GradeID',
            grades.Num              AS 'GradeNum',
            grades.Degree,
            subjects.ID             AS 'SubjectID',
            subjects.Name           AS 'SubjectName',
            subjects.Abbr           AS 'SubjectAbbr',
            faculties.ID            AS 'FacultyID',
            faculties.Name          AS 'FacultyName',
            faculties.Abbr          AS 'FacultyAbbr',
            compound_disciplines.Name AS 'CompoundDiscName'
        FROM `disciplines`
        INNER JOIN `subjects` ON subjects.ID = disciplines.SubjectID
        INNER JOIN `faculties` ON faculties.ID = disciplines.FacultyID
        INNER JOIN `grades` ON grades.ID = disciplines.GradeID
        LEFT JOIN `compound_disciplines` ON compound_disciplines.ID = disciplines.CompoundDiscID;




CREATE OR REPLACE VIEW `view_roadmap` AS
    SELECT  modules.DisciplineID,
            modules.ID AS 'ModuleID',
            modules.Name AS 'ModuleName',
            modules.OrderNum AS 'ModuleOrderNum',
            modules.Type AS 'ModuleType', # enum('regular','exam', 'bonus', 'extra')
            submodules.ID AS 'SubmoduleID',
            submodules.Name AS 'SubmoduleName',
            submodules.OrderNum AS 'SubmoduleOrderNum',
            submodules.MaxRate AS 'SubmoduleRate',
            submodules.Type AS 'SubmoduleType', # enum('CurrentControl','LandmarkControl')
            submodules.IsUsed AS 'SubmoduleIsUsed'
        FROM `modules`
        LEFT JOIN `submodules` ON submodules.ModuleID = modules.ID;