/* Unieke code format:
         * Registratiecode: 000-XXX00-00
         * KoppelCode:      XXX00-000-00
         *
         * XXX staat voor 3 letters van de docent
         * 00 staat voor 2 cijfers van de docent
         * -> voorbeeld: er zijn 2 docenten met dezelfde afkorting, aldus een cijfer erachter
         *      om deze docenten te kunnen onderscheiden.
         */
        public UniekeCode GenereerNieuweCode(string studentnummer, UniekeCodeType typeCode)
        {
            UniekeCode nieuweUniekeCode = null;
            int LaatsteNummeriekDeel1 = 0;
            int LaatsteNummeriekDeel2 = 0;
            string docentAfkorting = "";
            string[] laatsteCodeDelen = null;

            switch(typeCode)
            {
                case UniekeCodeType.REGISTRATIE:
                    laatsteCodeDelen = LaatsteCodes.LaatsteRegistratieCode.Code.Split('-');
                    LaatsteNummeriekDeel1 = int.Parse(laatsteCodeDelen[0]);
                    docentAfkorting = laatsteCodeDelen[1];
                    LaatsteNummeriekDeel2 = int.Parse(laatsteCodeDelen[2]);
                    break;
                case UniekeCodeType.KOPPEL:
                    laatsteCodeDelen = LaatsteCodes.LaatsteRegistratieCode.Code.Split('-');
                    docentAfkorting = laatsteCodeDelen[0];
                    LaatsteNummeriekDeel1 = int.Parse(laatsteCodeDelen[1]);
                    LaatsteNummeriekDeel2 = int.Parse(laatsteCodeDelen[2]);
                    break;
                default:
                    ErrorCode = "Niet bestaande unieke code type gekozen.";
                    break;
            }

            if(LaatsteNummeriekDeel1 == 999 && LaatsteNummeriekDeel2 == 99)
            {
                // Maximum aantal unieke codes bereikt.
                ErrorCode = "Maximum aantal codes gegenereerd";
            }
            else
            {
                // Maximum nog niet bereikt, dus hoog op met 1
                if (LaatsteNummeriekDeel2 == 99)
                {
                    // maximum van nummeriek deel2 bereikt, hoog nummeriek deel1 op
                    LaatsteNummeriekDeel1++;
                    LaatsteNummeriekDeel2 = 0;
                }
                else
                {
                    // maximum van nummeriek deel2 nog niet bereikt, dus hoog het op met 1
                    LaatsteNummeriekDeel2++;
                }
            }

            switch(typeCode)
            {
                case UniekeCodeType.REGISTRATIE:
                    nieuweUniekeCode = new UniekeCode(FormatUniekeCode(UniekeCodeType.REGISTRATIE, docentAfkorting, LaatsteNummeriekDeel1, LaatsteNummeriekDeel2), studentnummer, false);
                    break;
                case UniekeCodeType.KOPPEL:
                    nieuweUniekeCode = new UniekeCode(FormatUniekeCode(UniekeCodeType.KOPPEL, docentAfkorting, LaatsteNummeriekDeel1, LaatsteNummeriekDeel2), studentnummer, false);
                    break;
                default:
                    ErrorCode = "Niet bestaande unieke code type gekozen.";
                    break;
            }

            return nieuweUniekeCode;
        }
 public bool KoppelNieuweCodeAanStudent(UniekeCode studentUniekeCode)
 {
     Database.DBConnector dbInstance = new Database.DBConnector();
     if(dbInstance.KoppelStudentAanUniekeCode(studentUniekeCode))
     {
         return true;
     }
     return false;
 }
        internal CodeGenerator.LaatstGegenereerdeCode GetLaatsteUniekeCodes(string docentAfkorting)
        {
            CodeGenerator.LaatstGegenereerdeCode laatsteCodes = null;
            SqlCommand sqlComm = new SqlCommand("spGetLaatsteUniekeCodes", sqlConn);
            sqlComm.CommandType = System.Data.CommandType.StoredProcedure;
            sqlComm.Parameters.AddWithValue("@DOCAFKORTING", docentAfkorting);
            try
            {
                sqlConn.Open();
                SqlDataReader reader = sqlComm.ExecuteReader();
                if(reader.HasRows)
                {
                    laatsteCodes = new CodeGenerator.LaatstGegenereerdeCode();
                    while(reader.Read())
                    {
                        UniekeCode uniekeCode = new UniekeCode((string)reader["Code"], (string)reader["StudentNummer"], (bool)reader["CodeType"]);
                        switch(uniekeCode.isKoppelCode)
                        {
                            case true:
                                laatsteCodes.LaatsteKoppelCode = uniekeCode;
                                break;
                            case false:
                                laatsteCodes.LaatsteRegistratieCode = uniekeCode;
                                break;
                        }
                    }
                }
            }
            catch(Exception ex)
            {
                ErrorCode = ex.Message;
            }
            finally
            {
                sqlConn.Close();
            }

            return laatsteCodes;
        }
        internal bool KoppelStudentAanUniekeCode(UniekeCode studentUniekeCode)
        {
            SqlCommand sqlComm = new SqlCommand("spKoppelStudentAanUniekeCode", sqlConn);
            sqlComm.CommandType = System.Data.CommandType.StoredProcedure;
            sqlComm.Parameters.AddWithValue("@STUDENTNUMMER",studentUniekeCode.StudentNummer);
            sqlComm.Parameters.AddWithValue("@UNIEKECODE",studentUniekeCode.Code);
            sqlComm.Parameters.AddWithValue("@TYPECODE",studentUniekeCode.isKoppelCode);
            int success = 0;
            try
            {
                sqlConn.Open();
                success = int.Parse(sqlComm.ExecuteScalar().ToString());
            }
            catch(Exception ex)
            {
                ErrorCode = ex.Message;
            }
            finally
            {
                sqlConn.Close();
            }

            if(success == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        public UniekeCode GetUniekeCode(string studentNummer)
        {
            UniekeCode studentCode = null;
            SqlCommand sqlComm = new SqlCommand("spGetStudentUniekeCode", sqlConn);
            sqlComm.CommandType = System.Data.CommandType.StoredProcedure;
            sqlComm.Parameters.AddWithValue("@STUDENTNUMMER", studentNummer);
            try
            {
                sqlConn.Open();
                SqlDataReader reader = sqlComm.ExecuteReader();
                if(reader.HasRows)
                {
                    studentCode = new UniekeCode((string)reader["Code"], (string)reader["StudentNummer"], (bool)reader["CodeType"]);
                }
            }
            catch(Exception ex)
            {
                ErrorCode = ex.Message;
            }
            finally
            {
                sqlConn.Close();
            }

            return studentCode;
        }