#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cctype>  //kisbetű konvertáláshoz
#include <cstdlib>
#include <ctime>

using namespace std;


void ell_fajl(ifstream& bef)
{

    cout<<"Ad meg a fajl nevet!"<<"Segitseg: dna"<<endl;
    string a;
    cin>>a;
    bef.open (a);

    while(bef.fail())
    {
        cout<<"A fajl nem talalhato!"<<endl;
        cout<<"Ad meg a fajl nevet!"<<endl;
        string a;
        cin>>a;
        bef.open (a);
    }

    cout<<"Meg van a fajl!"<<endl;
}


vector<string> vektorba(ifstream& bef)
{
    vector<string> v;

    string s;

    while(getline(bef,s))
    {
        v.push_back(s);

    }

    cout<<"Feltoltottem a vektort!"<<endl;
    return v;
}


void vektorki(vector<string>& v)
{
    int hossz;
    hossz=v.size();
    for(int i=0; i<hossz; i++)
    {
        cout<<"Sorszam: "<<i+1<<endl<<"Sor tartalma: "<< v[i]<<endl;
        //ujvektornal lehet fura lesz a sorszam
    }
}

vector<string> hasznos_adatok(vector<string>& v)
{
    vector<string> ujvektor;

    int hossz;
    hossz=v.size();
    for(int i=0; i<hossz; i++)
    {
        if( (v[i]).length() !=0 and v[i][0]!='>' )
        {
            ujvektor.push_back(v[i]);
        }

    }
    vektorki(ujvektor);

    return ujvektor;
}



int nukleobazis_szamlalo(vector<string>&ujvektor, char bazis)  //hasznos vektor->újvektor refr.
{
    int hossz2= ujvektor.size();
    int sum=0;

    for( int i=0; i<hossz2; i++)
    {
        for(unsigned int j=0; j< ujvektor[i].size() ; j++)
        {
            if(ujvektor[i][j]==bazis)
            {

                sum++;
            }
        }
    }

    return sum;
}


char minimumkereses(vector<string>&vektor){

    vector<char>bazisok={'A','T','C','G'};

     int min = nukleobazis_szamlalo( vektor, bazisok[0] );
     char minbazis=bazisok[0];


        for(unsigned int i=1; i<bazisok.size(); i++){
            int sum=nukleobazis_szamlalo( vektor, bazisok[i] );
            if(sum<min){
                min=sum;
                minbazis=bazisok[i];
            }
        }
return minbazis;}


void aminosavkereses_kis_betu_lesz(vector<string>&vektor, string aminosav){

    string kisbetuk;
    for( unsigned int i=0; i<aminosav.length(); i++ ){
       kisbetuk+=( char( tolower(aminosav[i]) ) );
       /* int tolower(int karakter) -> karakterből int érték lesz
          és a tolower kis betűvé alakítja ASCII kódja alapján
          az előbbieket visszalakítottam char típusúvá;
            += hozzáadja a kisbetuk változóhoz és az [i] végig megy a cikluson*/
    }

    for(unsigned int i=0; i<vektor.size(); i++){

        string& sor=vektor[i];
        unsigned int szam = sor.find(aminosav);

            while(szam < sor.length()){
                    sor.replace( szam, aminosav.length(), kisbetuk);
        /* lecserélem a kezdőindextől az itt aminosavban található karaktereket kisbetűre a az aminosav hosszáig*/
                    szam = sor.find(aminosav);
        /*megint megkérdezem hol találom meg (melyik pozicíóban különben végtelen ciklus lesz */
            }
    }
}

//új függvény
int randomsorokba_egyezes_pontok_szerint(vector<string>&v){
        srand(time(0));
        int sor1=rand()% v.size();
        int sor2= rand ()% v.size();
            while(sor1==sor2){
                sor2= rand ()% v.size();
            }


            int sum=0;
        for(unsigned int i=0; i< v[sor1].size() && i< v[sor2].size() ; i++){
            if  ( v[sor1][i]  == v[sor2][i] ){sum++;}
        }

return sum;}



int main()
{

    cout << "DNS" << endl;
    ifstream bef;
    ell_fajl(bef);

    vector<string> v;
    v= vektorba(bef);

    vektorki(v);

    vector<string> hasznos_vektor = hasznos_adatok(v) ;


    cout<<"Melyik bazis elofordulasat szamolnad? A, T,G, C"<<endl;
    char bazis;
    cin>> bazis;
    cout << endl << bazis << ": ";
    cout<< nukleobazis_szamlalo(hasznos_vektor, bazis)<<endl;

    cout<<"A legkevesebbszer elofordulo bazis: "<<minimumkereses(hasznos_vektor)<<endl<<endl;

    cout<<"Bekerek egy aminosavat: "<<"(Segitseg: ATC)"<<endl<<endl;
    string aminosav;
    cin>>aminosav;

    cout<<"Az aminosavak kisbetuk lesznek: "<<endl;
    aminosavkereses_kis_betu_lesz(hasznos_vektor,aminosav);
    vektorki(hasznos_vektor);
    cout<<endl<<"Kisbetuk lettek az aminosavak"<<endl;

   cout<<"Van ket random sorom"<<endl<<
   "Megnezem az adott ket sorban hany ponton egyeznek meg:" <<endl<<randomsorokba_egyezes_pontok_szerint(hasznos_vektor)<<endl;
   cout<<"Kesz a feladatsor!"<<endl;


    bef.close();

    return 0;
}
