#include "persons.h"
#include "catalog.h"

#include <vector>
#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
#include "persons.h"
#include "catalog.h"


bool CyclistCatalog::Load(const std::string& path) {
    Cyclist c;
    std::string name, birth_s, id, team;
    int birthyear = 0;
    cyclists_.clear(); // Elimina todos los elementos si hubiera
    std::ifstream in(path);
    if (!in) {
        std::cerr << "-ERROR: No se pudo abrir " << path << "\n";
        return false;
    }
    std::string line;
    if (!std::getline(in, line)) return false; // saltar cabecera
    while (std::getline(in, line)) {
        if (line.empty()) continue;
        std::istringstream iss(line); // Define un stream de lectura a partir de line
        if (!std::getline(iss, name, ',')) continue;
        if (!std::getline(iss, birth_s, ',')) continue;
        if (!std::getline(iss, id, ',')) continue;
        if (!std::getline(iss, team)) continue;
        birthyear = std::stoi(birth_s);
        c.SetName(name);
        c.SetBirthYear(birthyear);
        c.SetCyclistId(id);
        c.SetTeam(team);
        cyclists_.push_back(c); // se hace una copia al final del vector
    }
    return !cyclists_.empty();
}

std::string CyclistCatalog::GetTeam(std::string cyclistID) const{
    for(auto& cyclist : cyclists_){
        if (cyclist.GetCyclistId()==cyclistID){
            return (cyclist.GetTeam());
        }
    }

    return "No existe ese ciclista";
}

std::vector<Cyclist> CyclistCatalog::GetByTeam(std::string team){
    std::vector<Cyclist> cyclistVect;

    for(auto& cyclist : cyclists_){
        if (cyclist.GetTeam()==team){
            cyclistVect.push_back(cyclist);
        }
    }

    return cyclistVect;
}

std::vector<Cyclist> CyclistCatalog::GetYoungest(){
    std::vector<Cyclist> cyclistVect;
    int minYear=cyclists_[0].GetBirthYear();

    for(auto& cyclist : cyclists_){
        if (minYear<cyclist.GetBirthYear()){
            minYear=cyclist.GetBirthYear();
        }
    }

    for(auto& cyclist : cyclists_){
        if (minYear==cyclist.GetBirthYear()){
            cyclistVect.push_back(cyclist);
        }
    }

    return cyclistVect;
}

CyclistCatalog& CyclistCatalog::operator<<(const Cyclist& ciclista){
    cyclists_.push_back(ciclista);
    return *this;
}

void CyclistCatalog::Add(Cyclist ciclista){
    cyclists_.push_back(ciclista);
}  

//DIRECTOR CATALOG

bool DirectorCatalog::Load(const std::string& path) {
    Director d;
    std::string name, birth_s, license, director_s, team;
    int birthyear = 0, directorsince=0;;

    directors_.clear(); // Elimina todos los elementos si hubiera
    std::ifstream in(path);
    if (!in) {
        std::cerr << "-ERROR: No se pudo abrir " << path << "\n";
        return false;
    }
    std::string line;
    if (!std::getline(in, line)) return false; // saltar cabecera
    while (std::getline(in, line)) {
        if (line.empty()) continue;
        std::istringstream iss(line); // Define un stream de lectura a partir de line
        if (!std::getline(iss, name, ',')) continue;
        if (!std::getline(iss, birth_s, ',')) continue;
        if (!std::getline(iss, license, ',')) continue;
        if (!std::getline(iss, team, ',')) continue;
        if (!std::getline(iss, director_s, ',')) continue;
        birthyear = std::stoi(birth_s);
        directorsince= std::stoi(director_s);
        d.SetName(name);
        d.SetBirthYear(birthyear);
        d.SetUciLicenseId(license);
        d.SetTeam(team);
        d.SetDirectorSince(directorsince);
        directors_.push_back(d); // se hace una copia al final del vector
    }
    return !directors_.empty();
}
