#include <iostream>         // i/o parancsok: cin, cout
#include <fstream>          // fájlkezelés
#include <algorithm>        // rendezés (sort)
#include <vector>           // vector adattípus
#include <string>           // szövegek
#include <cmath>            // matematikai függvények (négyzetgyök - sqrt)
#include <iomanip>          // valós szám kiírásának manipulálása (törtrész pontossága - fixed, setprecision)

using namespace std;

struct krater               // struktúra - x, y koordináták, sugár és kráter neve
{
    float x, y, r;
    string nev;
};

void F1(vector<krater> &k)      // kell az & jel, hogy a vector értéke változhasson...
{
    ifstream fbe;
    fbe.open("felszin_tpont.txt");
    krater temp;
    char tab;
    while(fbe >> temp.x && fbe >> temp.y && fbe >> temp.r && getline(fbe,temp.nev))
    {
        temp.nev = temp.nev.substr(1,temp.nev.size());  // tabulátor ne legyen a név elején
        k.push_back(temp);
    }
    fbe.close();
}

void F2(vector<krater> k)
{
    cout << "2. feladat" << endl;
    cout << "A kráterek száma: " << k.size() << endl;
}

void F3(vector<krater> k)
{
    cout << "3. feladat" << endl;
    cout << "Kérem egy kráter nevét: ";
    string kraternev;
    getline(cin, kraternev);                // getline kell, mert több szóból állóak a nevek
    int i = 0;
    while(i < k.size() && k[i].nev != kraternev)
    {
        i++;
    }
    if(i < k.size())
    {
        cout << "A(z) " << k[i].nev << " középpontja X=" << k[i].x << " Y=" << k[i].y << " sugara R=" << k[i].r << endl;
    }
    else cout << "Nincs ilyen nevű kráter." << endl;
}

bool sugarszerint(krater a, krater b)
{
    return a.r > b.r;       // csökkenő rendezés sugár szerint
}

void F4(vector<krater> k)
{
    cout << "4. feladat" << endl;
    sort(k.begin(), k.end(), sugarszerint);         // itt a sort parancs...
    cout << "A legnagyobb kráter neve és sugara: " << k[0].nev << " " << k[0].r << endl;
}

float tavolsag(float x1, float y1, float x2, float y2)
{
    return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}

void F6(vector<krater> k)
{
    cout << "6. feladat" << endl;
    cout << "Kérem egy kráter nevét: ";
    string kraternev;
    getline(cin, kraternev);
    int i = 0;
    while(i < k.size() && k[i].nev != kraternev)
    {
        i++;
    }
    if(i < k.size())
    {
        cout << "Nincs közös része: ";
        for(auto kr: k)
        {
            if(kr.nev != kraternev)
                if(tavolsag(k[i].x, k[i].y, kr.x, kr.y) > k[i].r + kr.r)
                    cout << kr.nev << ", ";
        }
        cout << endl;
    }
    else cout << "Nincs ilyen nevű kráter." << endl;
}

void F7(vector<krater> k)
{
    cout << "7. feladat" << endl;
    sort(k.begin(), k.end(), sugarszerint);
    for(int i = 0; i < k.size()-1; i++)
        for(int j = i + 1; j < k.size(); j++)
            if(tavolsag(k[i].x, k[i].y, k[j].x, k[j].y) < k[i].r - k[j].r)
                cout << "A(z) " << k[i].nev << " kráter tartalmazza a(z) " << k[j].nev << " krátert." << endl;
}

void F8(vector<krater> k)
{
    cout << "8. feladat - terulet.txt" << endl;
    ofstream fki;
    fki.open("terulet.txt");
    float pi = 3.14;
    for(auto kr: k)
    {
        cout << fixed << setprecision(2) << kr.r * kr.r * pi << "\t" << kr.nev << endl;     // iomanip...
        fki << fixed << setprecision(2) << kr.r * kr.r * pi << "\t" << kr.nev << endl;
    }
    fki.close();
}

int main()
{
    setlocale(LC_ALL,"");
    vector<krater> kraterek;
    F1(kraterek);
    F2(kraterek);
    F3(kraterek);
    F4(kraterek);
    F6(kraterek);
    F7(kraterek);
    F8(kraterek);
    return 0;
}
