# Archivos en Python


import csv
import json
import pandas as pd
import matplotlib.pyplot as plt


class Pokemon:
    # Type hints: herramientas como mypy
    # (11, "metapod", 0.7, 9.9, "bicho")   # pokemon putativo
    def __init__(self,
                 nid: int = 11,
                 nombre: str = "metapod",
                 altura: float = 0.7,
                 peso: float = 9.9,
                 tipo: str = "bicho"):
        self._nid = nid
        self._nombre = nombre
        self._altura = altura
        self._peso = peso
        self._tipo = tipo

        
    def to_list(self):
        return [
            self._nid,
            self._nombre,
            self._altura,
            self._peso,
            self._tipo]
        
    def __str__(self):
        return f"{self._nid}/{self._nombre}: {self._altura} m. {self._peso} kg." \
                + f" -- {self._tipo}"


def crea_pokemons():
    return [
        Pokemon(1,   "bulbosaur", 0.7, 6.9,  "planta"), 
        Pokemon(25,  "pikachu",   0.4, 6.0,  "eléctrico"),
        Pokemon(26,  "raichu",    0.8, 30.0, "eléctrico"),
        Pokemon(257, "blaziken",  1.9, 52.0, "fuego"),
    ]


def guarda_pokemons_txt(pokemons: list[Pokemon]):
    with open("pokemons.txt", "wt", encoding="utf-8") as f:
        for p in pokemons:
            print(str(p), file=f)
            #f.write(str(p) + "\n")


def recupera_archivo_pokemons_txt(nf: str):
    with open(nf, "rt") as f:
        for linea in f:
            print(linea.strip())
            

def guarda_pokemons_csv(pokemons: list[Pokemon]):
    with open("pokemons.csv", "wt", encoding="utf-8") as f:
        print("nid,nombre,altura,peso,tipo", file=f)
        w = csv.writer(f)
        for p in pokemons:
            w.writerow(p.to_list())
            
            
def guarda_pokemons_json(pokemons: list[Pokemon]):
    pokemon_dicts = [p.__dict__ for p in pokemons]
    with open("pokemons.json", "wt", encoding="utf-8") as f:
        json.dump(pokemon_dicts, f)
        
        
def recupera_archivo_pokemons_json(nf: str) -> list[Pokemon]:
    toret: list[Pokemon] = []
            
    with open(nf, "rt") as f:
        pokemon_dicts = json.load(f)
        
    for pd in pokemon_dicts:
        p = Pokemon()
        p.__dict__ = pd
        toret.append(p)

    return toret


def recupera_archivo_pokemons_csv(nf: str) -> list[Pokemon]:
    toret: list[Pokemon] = []
    
    with open(nf, "rt") as f:
        r = csv.DictReader(f)
        for linea in r:
            toret.append(
                Pokemon(
                    int(linea["nid"]),
                    linea["nombre"],
                    float(linea["altura"]),
                    float(linea["peso"]),
                    linea["tipo"]))

    return toret


def crea_archivo_pokemons_txt():
    pokemons = crea_pokemons()
    guarda_pokemons_txt(pokemons)
    
    
def lee_archivo_pokemons_txt():
    recupera_archivo_pokemons_txt("pokemons.txt")


def crea_archivo_pokemons_csv():
    pokemons = crea_pokemons()
    guarda_pokemons_csv(pokemons)
    
    
def lee_archivo_pokemons_csv():
    pokemons = recupera_archivo_pokemons_csv("pokemons.csv")
    for p in pokemons:
        print(p)
    
    
def lee_archivo_pokemons_json():
    pokemons = recupera_archivo_pokemons_json("pokemons.json")
    for p in pokemons:
        print(p)
        
    
def crea_archivo_pokemons_json():
    pokemons = crea_pokemons()
    guarda_pokemons_json(pokemons)
    
    
def lee_archivo_pokemons_csv_pandas():
    dfp: pd.DataFrame = pd.read_csv("pokemons.csv")
    print("Todos los pokemons\n", dfp)
    
    df_nombre_peso = dfp[["nombre", "peso"]]
    print("Todos los pokemons (nombre y peso)\n", df_nombre_peso)
    
    print("Todos los pokemons (nombre)\n", dfp[["nombre"]])
    dfp.altura.hist()
    plt.xlabel("Alturas")
    plt.ylabel("Cuántos")
    plt.show()

    
def main():
    # crea_archivo_pokemons_txt()
    # lee_archivo_pokemons_txt()
    # crea_archivo_pokemons_csv()
    # lee_archivo_pokemons_csv()
    # crea_archivo_pokemons_json()
    # lee_archivo_pokemons_json()
    lee_archivo_pokemons_csv_pandas()


if __name__ == "__main__":
    main()
