#include <iostream>
#include <fstream>
#include <iomanip>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <list>

using namespace std;

struct klass
{
    string fornamn;
    string efternamn;
    string personnr;
};

bool sFile( list<klass> lKlass );

int main()
{
    int val, elevnr, j, epos1, epos2, fpos1, fpos2, ppos1, ppos2;
    list<klass> lKlass;
    list<klass>::iterator it;
    klass sKlass;
    bool fortsatt, bSwitch, bInserted = false;
    char valjKlass[10], path[38], tempNamn[30];
    string filNamn, temp;
    ifstream inFil;

    while( 1 )
    {
        system("CLS");
        cout << "1. Skapa ny klass.\n";          
        cout << "2. L\x84gg till ny elev.\n";
        cout << "3. Spara klass till en fil.\n";
        cout << "4. H\x84mta klass fr\x86n fil.\n";
        cout << "5. Ta bort klass.\n";
        cout << "6. Ta bort elev.\n";
        cout << "7. Skriv ut klassen.\n";
        cout << "8. Avsluta.\n\n";
    
        cout << "Vad vill ni g\x94ra (Skriv inte in bokst\x84ver!!!): ";
        cin >> val;
        cin.ignore(1000, '\n');
    
        switch( val )
        {
            case 1:
                system("CLS");
                lKlass.clear();
                cout << "Listan \x84r nu rensad.\n";
                system("PAUSE");
                break;
            case 2:
                system("CLS");
                cout << "B\x94rja mata in elever (Avsluta med ett '#'): \n";
                cout << "Ange efternamnet p\x86 eleven: ";
                getline(cin, sKlass.efternamn);
                while( sKlass.efternamn != "#" )
                {
                    cout << "Elevens f\x94rnamn: ";
                    getline(cin, sKlass.fornamn);
                    cout << "Elevens personnummer: ";
                    getline(cin, sKlass.personnr);
                    
                    if ( lKlass.empty() == true ) {                        
                        lKlass.push_back( sKlass );    
                    
                    } else {
                        it = lKlass.begin();
                        fortsatt = true;
                    
                    	for( j = 0; fortsatt && (it != lKlass.end() ) && 
                 		   ( sKlass.efternamn >= it->efternamn ); j++ )
             		    {
             		        if ( sKlass.efternamn == it->efternamn) {
             		        	if ( sKlass.fornamn > it->fornamn) {
                                    fortsatt = false;
                                }    
                            }    
     		        	    it++;
                 		}   	
                    	lKlass.insert(it, sKlass);
                    }
                        
                    cout << "Ange efternamnet p\x86 en ny elev: ";
                    getline(cin, sKlass.efternamn);
                }
                break;
            case 3:
                system("CLS");
                sFile(lKlass);
                system("PAUSE");
                break;
            case 4:
                system("CLS");
             	
             	lKlass.clear();
              	it = lKlass.begin();                         
                                                                                                                                                       
                cout << "Vilken klass vill ni h\x84mta?\n";
    			getline(cin, filNamn);
                
                if( filNamn.length() > 30 ) {
        			filNamn = filNamn.substr(0, 30);
    			}    
				
    			strcpy( tempNamn, filNamn.c_str() );    
    			
    			strcpy( path, "C:\\" );
    			strcat( path, tempNamn );
    			strcat( path, ".txt" );
    			
    			inFil.open(path);
              	
              	if ( !inFil ) {
          	    	cout << "Filen kunde inte \x94ppnas\n";
              	   	system("PAUSE"); 
                   	break;
              	}    
              	
              	bSwitch = true;
              	
                while( bSwitch == true )
    			{ 
    			    
    	           	epos1 = 0;
           			epos2 = 0;
           			fpos1 = 0;
           			fpos2 = 0;
           			ppos1 = 0;
           			ppos2 = 0;
  			       
    			    getline(inFil, temp);
			     	
			     	cout << temp.length() << endl;
			     	
                 	if ( temp.length() < 10 || temp.length() == 0 ) {
       					bSwitch = false;
       					break;
			        }
                              			
        			epos1 = 0;
           			epos2 = temp.find(";", 0);
  				    sKlass.efternamn = temp.substr(epos1, epos2 - epos1);
  				    
					fpos1 = epos2 + 1;
					fpos2 = temp.find(";", epos2 + 1);
					sKlass.fornamn = temp.substr(fpos1, (fpos2 - fpos1));
    				
    				ppos1 = fpos2 + 1;
    				sKlass.personnr = temp.substr(ppos1);		                   
        			
        			
           			if ( lKlass.empty() == true ) {                        
                        lKlass.push_back( sKlass );   
                        cout << "Lägger in en elev" << endl; 
                    
                    } else {
                    	it = lKlass.begin();	 
                        
                        while ( it != lKlass.end() )
                        {
                            while ( it != lKlass.end() )
                            {
                                if ( it->efternamn == sKlass.efternamn ) {
                                    bInserted = true;
                                }
                                it++;
                            }        
                         	it = lKlass.begin();
                            
                            if ( bInserted ) {
                                while ( it != lKlass.end() )
                                {
                                    if ( sKlass.efternamn != it->efternamn ) {
                                        it++;
                                    } else {
                                        break;
                                    }
                                }
                                            
                                if ( sKlass.efternamn == it->efternamn ) {
                                	if ( sKlass.fornamn < it->fornamn ) {
                                		lKlass.insert(it, sKlass);
                                		it++;
                                		cout << "Bumpar ned en elev med samma efternamn" << endl;
                                		break;
                                	
                             		} else {
                             	    	while ( it != lKlass.end() && sKlass.efternamn == it->efternamn )
                             	    	{
                             	        	it++;
                             	    	}    
                                    	lKlass.insert(it, sKlass);
                                    	cout << "Skall lägga en elev med samma efternamn sist, men vill sig inte" << endl;
										break;
                                	}
								} 
                                bInserted = false;
                                
                            } else {
                            	if ( sKlass.efternamn < it->efternamn ) {
                                	lKlass.insert(it, sKlass);
                            		it++;
                            		cout << "Bumpar ned en elev med ett efternamn större än dennes" << endl;
                            		break;
                            	
                            	} else { 
                                	it++;
                                	lKlass.push_back(sKlass);
                                	cout << "Bumpar en elev allra längst ned i listan" << endl;
                                	break;
                        		}  
                     		}      
                        }               
                                
                        
                        
                        
                        /*
                        fortsatt = true;
                    
                    	for( j = 0; fortsatt && (it != lKlass.end() ) && 
                 		   ( sKlass.efternamn >= it->efternamn ); j++ )
             		    {
             		        if ( sKlass.efternamn == it->efternamn) {
             		        	while ( sKlass.efternamn == it->efternamn && sKlass.fornamn > it->fornamn )
                        		{
                              		it++;
                            	}
                             	lKlass.insert(it, sKlass);  
                              	bInserted = true;  	
                   			}            
                          	
                           	if ( sKlass.efternamn > it->efternamn) {
                           		fortsatt = false;
                        	}          	
                        	
     		        	    it++;
                 		}
                    
                   		if ( !bInserted ) {  	
                    		lKlass.insert(it, sKlass);
                   		}
                     	*/   		
                    }
    			}				
                
                cout << "Hejhopp" << endl;
                
                inFil.close();
                inFil.clear();

                system("PAUSE");
                
                break;
            case 5:
                system("CLS");
                cout << "Vilken klass vill ni ta bort: ";
                cin.getline( valjKlass, 10);
                char buffert[18];
                
                /*
                Pluspoäng:
                    Lägg till en lista \x94ver alla filer som heter
                    klass.xxxxx.txt med numrering så att man får
                    välja vilken klass ur en lista, man vill ta bort                
                */
                
                
                strcpy( buffert, "DEL c:\\");
                strcat( buffert, valjKlass);
                strcat( buffert, ".txt");
                system( buffert);
                
    			system("PAUSE");
                break;
            case 6:
                system("CLS");
                it = lKlass.begin();
                
                for(j = 0; j < lKlass.size(); j++)
                {
                    cout << j << ". " << it->efternamn << ' ' << it->fornamn 
                         << ' ' << it->personnr  << endl;
                    it++;
                }
                
                cout << "Vilken elev vill ni ta bort: ";
                cin >> elevnr;
                cin.ignore(1000, '\n');
                
                it = lKlass.begin();
                
                for(j = 0; j < lKlass.size(); j++)
                {
                    if(elevnr == j)
                    {
                        lKlass.erase(it);
                    }
                    it++;
                }        
                system("PAUSE");
                break;
            case 7:
                system("CLS");
                it = lKlass.begin();
                
                for(j = 0; j < lKlass.size(); j++)
                {
                    cout << it->efternamn << ' ' << it->fornamn 
                         << ' ' << it->personnr  << endl;
                    it++;
                }
                system("PAUSE");
                break;
            case 8:
                return 0;
            default:
                system("CLS");
                cout << "Felaktigt val!\n";
                system("PAUSE");
                system("CLS");
                break;
        }
    }
}

bool sFile( list<klass> lKlass )
{
    list<klass>::iterator it;
    char filNamn[30], temp[38];
    string tempNamn;
    ofstream utFil;    

    cout << "Vilken klass h\x86ller du p\x86 att spara?\n";
    getline(cin, tempNamn);
    
    if( tempNamn.length() > 30 ) {
        tempNamn = tempNamn.substr(0, 30);
    }    

    strcpy( filNamn, tempNamn.c_str() );    
    
    strcpy( temp, "C:\\" );
    strcat( temp, filNamn );
    strcat( temp, ".txt" );
    
    utFil.open(temp);
    
    if ( !utFil )
    {
        cout << "Filen kunde inte \x94ppnas";
        return false;
    }    
    
    it = lKlass.begin();
    while ( it != lKlass.end() )
    {
 		utFil << it->efternamn;
    	utFil << ';';
        utFil << it->fornamn;
        utFil << ';';
        utFil << it->personnr;
	    utFil << '\n';
            
         	
     	it++;
    }    

    utFil.close();
}