#include <iostream>
#include <fstream>
#include <cstdlib>
#include <sstream>
#include <string>

using namespace std;

string ipcimek[500];
int db;                                                     ///db változóba tároljuk majd az ipcimek számát.
int fajl_beovasasa();                                       ///db értékével tér vissza
int ipcimek_szama();
string legalacsonyabb_ipcim();
void ipcim_tipusok_szama(int tipus[3]);                     ///a tipus tömböt tölti fel a megfelelö értékekkel
void legalabb_18_nullat_tartalmazo_cimek_fajlba_irasa();
void ipcim_kiirasa(int sorszam);
string rovid_ipcim(int sorszam);                            ///6. feladathoz
void ipcim_rovidetese(string ipcim);                        ///7. feladathoz

int main()
{
setlocale(LC_ALL, "hun");
    cout << "1. feladat: Fájlok beolvasása" << endl;
    db=fajl_beovasasa();
    cout << endl;

    cout << "2. feladat: Ip címek száma: " ;
    cout << ipcimek_szama();
    cout << endl;

    cout << "3. feladat: A legalacsonyabb ip cím: ";
    cout << legalacsonyabb_ipcim();
    cout << endl;

    cout << "4. feladat: Az egyes ip cím típusok" << endl;
    int tipus[3];
    ipcim_tipusok_szama(tipus);

    cout << "Dokumentációs cím: " << tipus[0] << " darab" << endl;
    cout << "Globális egyedi cím: " << tipus[1] << " darab" << endl;
    cout << "Helyi egyedi cím: " << tipus[2] << " darab" << endl;
    cout << endl;

    cout << "5. feladat: Legalább 18 nullát tartalmazó ip címek fájlba írása." << endl;
    legalabb_18_nullat_tartalmazo_cimek_fajlba_irasa();

    cout << "6. feladat: Felhasználó által kért ip cím kiírása." << endl;
    cout << "Adja meg a sorszámot: ";
    int sorszam;
    cin >> sorszam;
    ipcim_kiirasa(sorszam);
    cout << rovid_ipcim(sorszam);
    cout << endl;

    cout << "7. feladat: Felhasználó által kért ip cím rövidítése." << endl;
    ipcim_rovidetese(rovid_ipcim(sorszam));
    cin.get();
    return 0;
}

///függvény definiciók
int fajl_beovasasa() {

    ifstream be;
    be.open("ip.txt");
    if(be.fail()) {

        cout << "A fájl nem nyitható meg";
        cin.get();
        exit(-1);
    }
    string  sor;
    int i=0;
    while(!be.eof()) {

            getline(be,sor);
            if(sor!=""){ ///A forrás fájl utolsó sora miatt!!!
                ipcimek[i]=sor;
                i++;
            }
    }

    be.close();
    return i;

}

int ipcimek_szama(){

    return db;
}

string legalacsonyabb_ipcim() {
string legalacsonyabb=ipcimek[0];

    for(int i=1;i<db;i++ ){

        if(ipcimek[i]<legalacsonyabb) legalacsonyabb=ipcimek[i];

    }

return legalacsonyabb;

}

void ipcim_tipusok_szama(int tipus[3]){

    for(int i=0;i<3;i++) {

            tipus[i]=0;

    }

    for(int i=0; i<db;i++ ){

       if(!ipcimek[i].compare(0,9,"2001:0db8")) tipus[0]++;
       else if(!ipcimek[i].compare(0,7,"2001:0e")) tipus[1]++;
       else if(!ipcimek[i].compare(0,2,"fc") || !ipcimek[i].compare(0,2,"fd")) tipus[2]++;

    }

}

void legalabb_18_nullat_tartalmazo_cimek_fajlba_irasa(){

    ofstream ki;
    ki.open("sok.txt");
    if(ki.fail()) {

        cout << "A fájl nem nyitható meg";
        cin.get();
        exit(-1);
    }
    for(int i=0;i<db; i++) {
       unsigned int j=0;
       int db=0;
       while(j!=ipcimek[i].length() && db!=18) {

            if(ipcimek[i][j]=='0') db++;

        j++;
       }

       if(db==18) {
            ki << i+1 << " " << ipcimek[i] << endl;
       }

    }

}

void ipcim_kiirasa(int sorszam){

    cout << ipcimek[sorszam-1] << endl;

}


string rovid_ipcim(int sorszam){

stringstream rovidipcim;
string ipcim=ipcimek[sorszam-1];

for(unsigned int i=0; i<ipcim.length(); i++) {

    if(i%5==0 && ipcim[i]=='0') i++;
    if(i%5==1 && ipcim[i-1]=='0' && ipcim[i]=='0') i++;
    if(i%5==2 && ipcim[i-2]=='0' && ipcim[i-1]=='0' && ipcim[i]=='0') i++;
    rovidipcim << ipcim[i];

}

return rovidipcim.str();

}

void ipcim_rovidetese(string rovidipcim) {

rovidipcim=rovidipcim.append(":"); ///hozzáfűzünk a végére egy ":" karaktert
if(rovidipcim.find(":0:0:0:0:0:0:0:")!=rovidipcim.npos) rovidipcim.replace(rovidipcim.find(":0:0:0:0:0:0:0:"),15,"::");
else if(rovidipcim.find(":0:0:0:0:0:0:")!=rovidipcim.npos) rovidipcim.replace(rovidipcim.find(":0:0:0:0:0:0:"),13,"::");
else if(rovidipcim.find(":0:0:0:0:0:")!=rovidipcim.npos) rovidipcim.replace(rovidipcim.find(":0:0:0:0:0:"),11,"::");
else if(rovidipcim.find(":0:0:0:0:")!=rovidipcim.npos) rovidipcim.replace(rovidipcim.find(":0:0:0:0:"),9,"::");
else if(rovidipcim.find(":0:0:0:")!=rovidipcim.npos) rovidipcim.replace(rovidipcim.find(":0:0:0:"),7,"::");
else if(rovidipcim.find(":0:0:")!=rovidipcim.npos) rovidipcim.replace(rovidipcim.find(":0:0:"),5,"::");

///Ha nem a végét rövidítettük, akkor cím végén van egy felesleges ":"
if(rovidipcim[rovidipcim.length()-1]==':' && rovidipcim[rovidipcim.length()-2]!=':' ) rovidipcim=rovidipcim.substr(0,rovidipcim.length()-1);
cout << "A rövid ipcim: " << rovidipcim;

}
