import random
import csv
import matplotlib.pyplot as plt


MalePop = 14
FemalePop = 2
tick = 0
Egg = []
ticksToHatch = 20

# Poblaciones en cada tick
plot = []
plotM = []
plotF = []

# Probabilidad de muetre
DeathRate = 0.0243

# Probabilidad de impregnación
ImpRate = [0.5, 0.1]

# Tipo de relación a usar
# True  si va a haber más hembras que machos
# False si va a haber más machos que hembras
FM = False
# Hembras por cada macho

FMRate = 7
# Hembras por cada macho
MFRate = 7

for i in range(ticksToHatch + 1): # En base al código de Austin
    Egg.append(0)

with open('BulbasaurPopulationSinHumanos.csv', 'a', newline='') as csv_file:
        fieldnames = ['tick', 'hembras', 'machos']
        writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
        writer.writeheader()
        csv_file.close()

while True:
    with open('BulbasaurPopulationSinHumanos.csv', 'a', newline='') as csv_file:
        fieldnames = ['tick', 'hembras', 'machos']
        writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
        writer.writerow({'tick': tick, 'hembras': FemalePop, 'machos': MalePop})
        csv_file.close()
    tick += 1
    print("Tick:", tick)
    
    # Población de hembras muertas
    for x in range(FemalePop):
        death = random.random()
        if death <= DeathRate:
            FemalePop -= 1
            
    # Población de machos muertos
    for x in range(MalePop):
        death = random.random()
        if death <= DeathRate:
            MalePop += -1
            
    # Decidir si el huevo va a ser macho o hembra
    if Egg[0] > 0:
        print ("¡", Egg[0], "huevos de Bulbasaur se están abriendo!")
        for x in range(Egg[0]):
            # Ok, se ve más complejo, pero así evitas
            # impresiciones con el punto decimal :D
            if FM:
                sexroll = random.randint(1,FMRate + 1)
                if sexroll <= FMRate:
                    FemalePop += 1
                else:
                    MalePop += 1
            else:
                sexroll = random.randint(1,MFRate + 1)
                if sexroll <= MFRate:
                    MalePop += 1
                else:
                    FemalePop += 1
    
    # Mover valores del búffer de huevos
    for i in range(20):
        Egg[i] = Egg[i+1]

    # Impregnar hembras
    if MalePop >=1:
        #
        for x in range(FemalePop):
            egg = random.random()
            if egg <= ImpRate[0]:
                Egg[ ticksToHatch ] += 1
                
    elif FemalePop >=1:
        for x in range(FemalePop):
            egg = random.random()
            if egg <= ImpRate[1]:
                Egg[ ticksToHatch ] += 1

              
    # Información
    print("Población total:", FemalePop+MalePop)
    print("Hembras:", FemalePop)
    print("Machos:\n", MalePop)

    plot.append(FemalePop+MalePop)
    plotM.append(MalePop)
    plotF.append(FemalePop)
    
    if FemalePop+MalePop >= 20000:
        print("Máxima población alcanzada")

        break
    else:
        tmp = FemalePop
        for i in range(20):
            tmp += Egg[20]
            if tmp == 0:
                print("Extinción Inminente")
                break

plt.plot(plot, color="black")
plt.plot(plotM, color="blue")
plt.plot(plotF, color="red")
plt.show()