#include <iostream>     // cin cout
#include <iomanip>      // setw setprecision
#include <fstream>      // szöveges fájlok kezelése
#include <vector>       // vektor (vector) adattípushoz (count)
#include <algorithm>    // sort, max_element, min_element
#include <numeric>      // accumulate
#include <ctime>        // random számokhoz
#include <windows.h>    // color a szövegekiírásokhoz

using namespace std;    // standard i/o eszközökre mennek pl. a cin és cout parancsok

void Color(int color)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}

void vector_constructor(vector<int>& v, int db)
{
    srand(time(NULL));                  // véletlenszám-generátor inicializálása
    for(auto i=0; i<db; i++)
    {
        v.push_back(rand()%100+1);      // 1-100 közötti véletlenszám megy a vektorba
    }
}

void vector_print(vector<int> v, string filename, string label)
{
    ofstream fki;
    fki.open(filename);
    cout << label;
    for(int elem:v)    // vektor "bejárása" elemenként
    {
        cout << elem << " ";
        fki << elem << " ";
    }
    cout << endl;
    fki.close();
}

void vector_sort(vector<int>& v, string desc)
{
    if(desc=="desc")
        sort(v.rbegin(), v.rend());
        // sort(v.begin(), v.end(), greater<int>());
    else
        sort(v.begin(), v.end());
}

unsigned long int vector_meret(vector<int> v)
{
    return v.size();
}

void vector_ujelem(vector<int>& v, int hely, int ertek)
{
    v.insert(v.begin()+hely, ertek);
}

float vector_atlag(vector<int> v)
{
    return (float)accumulate(v.begin(), v.end(), 0) / (float)v.size();
}

int main()
{
    setlocale(LC_ALL, "hun");
    vector<int> vec;
    int uj, helye;

    vector_constructor(vec,  10);
    Color(15);  // fehér
    cout << "Vektor mérete: " << vector_meret(vec) << endl;
    Color(10);  // zöld
    vector_print(vec, "vektor.txt", "Vektor elemei......: ");
    // Új elem beszúrása a vektorba
    cout << "Új elem értéke: ";
    cin >> uj;
    cout << "Új elem helye : ";
    cin >> helye;
    vector_ujelem(vec, helye-1, uj);

    Color(15);  // fehér
    cout << "Vektor mérete: " << vector_meret(vec) << endl;
    Color(10);  // zöld
    vector_print(vec, "vektor.txt", "Vektor elemei......: ");
    Color(70);  // piros-sárga
    cout << "Vektor legnagyobb eleme  : " << setw(6) << *max_element(vec.begin(), vec.end()) << " " << endl;
    Color(19);  // kék-szürke
    cout << "Vektor legkisebb eleme   : " << setw(6) << *min_element(vec.begin(), vec.end()) << " " << endl;
    Color(70);  // piros-sárga
    cout << "Vektor elemeinek összege : " << setw(6) << accumulate(vec.begin(), vec.end(),0) << " " << endl;
    Color(19);  // kék-szürke
    cout << "Vektor elemeinek átlaga  : " << setprecision(5) << vector_atlag(vec) << " " << endl;
    Color(10);  // zöld
    vector_sort(vec, "desc");
    vector_print(vec, "sorted_vector.txt", "Csökkenő sorrendben: ");

    vector_sort(vec, "asc");
    vector_print(vec, "sorted_vector.txt", "Emelkedő sorrendben: ");
    Color(15);  // fehér

    // Adott indexű elem lekérdezése
    cout << "Melyik sorszámú elemre kiváncsi? ";
    cin >> helye;
    cout << helye << ". elem (indexe: " << helye-1 << ")" << " értéke: ";
    Color(70);  // piros-sárga
    cout << setw(4) << vec[helye-1] << " " << endl;

    Color(15);  // fehér

    return 0;
}
