import csv
import urllib.request as ul
import codecs
import matplotlib.pyplot as plt
import scipy as sc
from scipy.stats.stats import kstest
import numpy as np
import numpy.random as rd


def symuluj_ubezpieczenia(l_klientow,nadwyzka,skladka,srednia_l_szkod=0.15,sr_szkoda_ln=7.995364,std_szkoda_ln=0.964477):
    daty_umow = rd.randint(0,365, l_klientow)
    kal_l_wplat = np.zeros(365+365+30, dtype="int")
    for dataUmowy in daty_umow:
        kal_l_wplat[dataUmowy] += 1  
    l_szkod_k = rd.poisson(srednia_l_szkod,l_klientow)    
    kal_l_wyplat = np.zeros(365+365+30, dtype="int") #365 to zapas
    for k in range(l_klientow):
        for s in range(l_szkod_k[k]):
            #dla kazdej szkody ustal date wyplaty
            data_wyp = daty_umow[k]+rd.randint(0,365)+rd.randint(15,30)
            kal_l_wyplat[data_wyp] += 1            
    for dzien in range(len(kal_l_wyplat)):
        nadwyzka += kal_l_wplat[dzien]*skladka
        odszkodowania = 0 
        if  kal_l_wyplat[dzien]>0:
            odszkodowania=np.sum(rd.lognormal(sr_szkoda_ln,std_szkoda_ln, kal_l_wyplat[dzien]))
        if ( nadwyzka < odszkodowania ):
           return (nadwyzka-odszkodowania, dzien)
        nadwyzka -= odszkodowania
    return (nadwyzka, dzien)
    
def licz(blok):
    with open("C:/temp/aaa/wynik"+str(blok)+".txt","w", newline="") as f:
        cs = csv.writer(f,delimiter="\t",quotechar=None)    
        for skladka in range(500+blok*100,500+(blok+1)*100,25):
            rd.seed(0)
            wyniki=[symuluj_ubezpieczenia(10000,10000,skladka)\
                    for i in range(100)]
            wyn_dodatnie = [x[0] for x in wyniki if x[0] >= 0]
            srednia = 0.0 if len(wyn_dodatnie)==0 else np.mean(wyn_dodatnie)
            liczba_ruin = np.sum([1 for x in wyniki if x[0] < 0])
            dni_ruiny=[x[1] for x in wyniki if x[0] < 0]
            sredni_dzien_ruiny = -1.0 if len(dni_ruiny) ==0 else np.mean(dni_ruiny)        
            cs.writerow([skladka,srednia,liczba_ruin,sredni_dzien_ruiny])

from multiprocessing import Pool

if __name__ == '__main__':
    PROCESSES = 4
    pool = Pool(processes=PROCESSES)
    print("Created a pool of",PROCESSES," processes")
    pool.map(licz, range(1,9))
    pool.terminate()
