#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
using namespace std;

struct Datum {
    int ev, honap, nap;

    int hany_napja_volt() {
        if (ev == 2018 and honap == 1)
            return 30 - nap;
        else if (ev == 2017 and honap == 12)
            return 30 + 31 - nap;
        else
            return -1;
    }
};

struct Video {
    string video_id, title, channel;
    Datum publish_date;
    long views, likes, dislikes, comment_count;
};

ostream& operator<< (ostream& out, Video v) {
    out << v.video_id << ";" << v.title << ";" << v.channel << ";"
        << v.publish_date.ev << "-" << v.publish_date.honap << "-" << v.publish_date.nap << ";"
        << v.views << ";" << v.likes << ";" << v.dislikes << ";" << v.comment_count << endl;
    return out;
}

struct Adatbazis {
    vector<Video> videok;

    Video sor_darabol(string sor) {
        stringstream ss(sor);
        Video video;
        getline(ss, video.video_id, ';');
        getline(ss, video.title, ';');
        getline(ss, video.channel, ';');
        char kuka;
        ss >> video.publish_date.ev >> kuka >> video.publish_date.honap >> kuka >> video.publish_date.nap >> kuka
           >> video.views >> kuka >> video.likes >> kuka >> video.dislikes >> kuka >> video.comment_count;
        return video;
    }

    void beolvas() {
        ifstream f("US_videos.txt");
        if (f.fail()) {
            cerr << "A fajl megnyitasa sikertelen!\n";
            return;
        }
        string sor;
        getline(f, sor);
        while (getline(f, sor))
            videok.push_back(sor_darabol(sor));
    }

    void ellenoriz() {
        for (size_t i = 0; i < 3; i++)
            cout << videok[i];
        for (size_t i = videok.size()-3; i < videok.size(); i++)
            cout << videok[i];
    }

    void A_csop_1() {
        cout << "A csoport 1.feladat\n\t";
        int szamlalo = 0;
        for (size_t i = 0; i < videok.size(); i++)
            if (videok[i].views > 1000000 and videok[i].publish_date.ev == 2018)
                szamlalo++;
        cout << szamlalo << " 2018-ban megjelent video nezettsege haladja meg az 1 milliot.\n";
    }

    void A_csop_2() {
        cout << "A csoport 2.feladat\n\t";
        double comment_count = 0;
        for (size_t i = 0; i < videok.size(); i++)
            comment_count += videok[i].comment_count;
        double comment_atlag = comment_count / videok.size();

        float max_atlag = float(videok[0].views) / videok[0].publish_date.hany_napja_volt();
        size_t hely = 0;
        for (size_t i = 1; i < videok.size(); i++)
            if (comment_atlag < videok[i].comment_count and
                max_atlag < float(videok[i].likes) / videok[i].publish_date.hany_napja_volt()){
                max_atlag = float(videok[i].likes) / videok[i].publish_date.hany_napja_volt();
                hely = i;
            }
        cout << "A 2017.12.01. utan megjelent, atlagosnal tobb kommentet kapo videok kozul a '" << videok[hely].title << "' cimu gyarapitotta a pozitiv visszajelzesek szamat a leggyorsabb tempoban (" << max_atlag << "/nap)" << endl;
    }

    struct Csatorna {
        string channel;
        unsigned leghosszabb_cim;
        unsigned legrovidebb_cim;
        unsigned szamlalo;
    };

    int csatorna_keres(vector<Csatorna>& csatornak, string keresett_csatorna) {
        for (size_t i = 0; i < csatornak.size(); i++)
            if (csatornak[i].channel == keresett_csatorna)
                return i;
        return -1;
    }

    void A_csop_3() {
        cout << "A csoport 3.feladat\n\t";
        vector<Csatorna> csatornak;
        for (size_t i = 0; i < videok.size(); i++) {
            int hely = csatorna_keres(csatornak, videok[i].channel);
            if (hely != -1) {
                if (videok[i].title.length() > csatornak[hely].leghosszabb_cim)
                    csatornak[hely].leghosszabb_cim = videok[i].title.length();
            } else
                csatornak.push_back({videok[i].channel,videok[i].title.length(),videok[i].title.length(),0});
        }

        for (size_t i = 0; i < videok.size(); i++) {
            int hely = csatorna_keres(csatornak, videok[i].channel);
            if (csatornak[hely].leghosszabb_cim/2 > videok[i].title.length())
                csatornak[hely].szamlalo++;
        }

        unsigned maximum = csatornak[0].szamlalo;
        size_t maximum_hely = 0;
        for (size_t i = 1; i < csatornak.size(); i++)
            if (maximum < csatornak[i].szamlalo) {
                maximum = csatornak[i].szamlalo;
                maximum_hely = i;
            }
        cout << csatornak[maximum_hely].channel << " csatorna rendelkezik a legtobb olyan videoval, amelynel ketszer hosszabb cimu videot is tartalmaz ugyanaz a csatorna.\n";
    }

    void B_csop_1() {
        cout << "B csoport 1.feladat\n\t";
        unsigned maximum = videok[0].likes;
        unsigned maximum_hely = 0;
        for (size_t i = 1; i < videok.size(); i++)
            if (videok[i].publish_date.ev == 2018 and maximum < videok[i].likes) {
                maximum = videok[i].likes;
                maximum_hely = i;
            }
        cout << videok[maximum_hely].title << " a cime annak a videonak, ami a legtobb pozitiv visszajelzest kapta (" << maximum << ").\n";
    }

    void B_csop_2() {
        cout << "B csoport 2.feladat\n\t";
        double comment_count = 0;
        for (size_t i = 0; i < videok.size(); i++)
            comment_count += videok[i].comment_count;
        double comment_atlag = comment_count / videok.size();

        float max_atlag = float(videok[0].views) / videok[0].publish_date.hany_napja_volt();
        size_t hely = 0;
        for (size_t i = 1; i < videok.size(); i++)
            if (comment_atlag > videok[i].comment_count and
                max_atlag < float(videok[i].views) / videok[i].publish_date.hany_napja_volt()){
                max_atlag = float(videok[i].views) / videok[i].publish_date.hany_napja_volt();
                hely = i;
            }
        cout << "A 2017.12.01. utan megjelent, atlagosnal kevesebb kommentet kapo videok kozul a '" << videok[hely].title << "' cimu gyarapitotta a pozitiv visszajelzesek szamat a leggyorsabb tempoban (" << max_atlag << "/nap)" << endl;
    }

    void B_csop_3() {
        cout << "B csoport 3.feladat\n\t";
        vector<Csatorna> csatornak;
        for (size_t i = 0; i < videok.size(); i++) {
            int hely = csatorna_keres(csatornak, videok[i].channel);
            if (hely != -1) {
                if (videok[i].title.length() < csatornak[hely].legrovidebb_cim)
                    csatornak[hely].leghosszabb_cim = videok[i].title.length();
            } else
                csatornak.push_back({videok[i].channel,videok[i].title.length(),videok[i].title.length(),0});
        }

        for (size_t i = 0; i < videok.size(); i++) {
            int hely = csatorna_keres(csatornak, videok[i].channel);
            if (csatornak[hely].legrovidebb_cim*2 < videok[i].title.length())
                csatornak[hely].szamlalo++;
        }

        unsigned maximum = csatornak[0].szamlalo;
        size_t maximum_hely = 0;
        for (size_t i = 1; i < csatornak.size(); i++)
            if (maximum < csatornak[i].szamlalo) {
                maximum = csatornak[i].szamlalo;
                maximum_hely = i;
            }
        cout << csatornak[maximum_hely].channel << " csatorna rendelkezik a legtobb olyan videoval, amelynel fele olyan rovid cimu videot is tartalmaz ugyanaz a csatorna.\n";
    }

};

int main () {
    Adatbazis adatbazis;
    adatbazis.beolvas();
    //adatbazis.ellenoriz();
    adatbazis.A_csop_1();
    adatbazis.A_csop_2();
    adatbazis.A_csop_3();
    adatbazis.B_csop_1();
    adatbazis.B_csop_2();
    adatbazis.B_csop_3();
}
