#exec(open("Bolsas.py").read())

import gudhi
import gudhi.representations
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial.distance import pdist, squareform
import random
import os
import warnings
warnings.filterwarnings('ignore')

from smeUtils import *
from smeGudhi import *


#exec(open("smeUtils.py").read())
#exec(open("smeGudhi.py").read())
exec(open("BolsasAux.py").read())
exec(open("auxMatlabEx.py").read())

# Exemplo:
# 
#  rc = BolsasFile("NY_20080102_20081231__319_dim250.txt", edgeMax=0.2, maxDim=4, sparse=None, skip=0, cols=[0,1,2,3], persLim=0.03)
#  rc = BolsasFile("/db/Economia/DataOrg2026/NY_20080102_20081231__319_dim250.txt", edgeMax=0.12, maxDim=3, sparse=None, skip=0, cols=[1,2,3], persLim=0.03)
#  rc = Bolsas(1998, 0, edgeMax=0.2, maxDim=4, sparse=None, skip=0, cols=[1,2,3], persLim=0.03)
#  rc = Bolsas(1998, 0, edgeMax=0.15, maxDim=4, sparse=None, skip=0, cols=[0,1,2,3], persLim=0.03)
#

fnames = {
    1989:["NY_19890421_19891229__319_dim175.txt","NY_19890421_19890630__319_dim49.txt" ,"NY_19890703_19891229__319_dim125.txt"],
    1990:["NY_19900102_19901231__319_dim252.txt","NY_19900102_19900629__319_dim125.txt","NY_19900702_19901231__319_dim126.txt"],
    1991:["NY_19910102_19911231__319_dim252.txt","NY_19910102_19910628__319_dim124.txt","NY_19910701_19911231__319_dim127.txt"],
    1992:["NY_19920102_19921231__319_dim253.txt","NY_19920102_19920630__319_dim125.txt","NY_19920701_19921231__319_dim127.txt"],
    1993:["NY_19930104_19931231__319_dim252.txt","NY_19930104_19930630__319_dim124.txt","NY_19930701_19931231__319_dim127.txt"],
    1994:["NY_19940103_19941230__319_dim251.txt","NY_19940103_19940630__319_dim124.txt","NY_19940701_19941230__319_dim126.txt"],
    1995:["NY_19950103_19951229__319_dim251.txt","NY_19950103_19950630__319_dim125.txt","NY_19950703_19951229__319_dim125.txt"],
    1996:["NY_19960102_19961231__319_dim253.txt","NY_19960102_19960628__319_dim125.txt","NY_19960701_19961231__319_dim127.txt"],
    1997:["NY_19970102_19971231__319_dim252.txt","NY_19970102_19970630__319_dim124.txt","NY_19970701_19971231__319_dim127.txt"],
    1998:["NY_19980102_19981231__319_dim251.txt","NY_19980102_19980630__319_dim123.txt","NY_19980701_19981231__319_dim127.txt"],
    1999:["NY_19990104_19991231__319_dim251.txt","NY_19990104_19990630__319_dim123.txt","NY_19990701_19991231__319_dim127.txt"],
    2000:["NY_20000103_20001229__319_dim251.txt","NY_20000103_20000630__319_dim125.txt","NY_20000703_20001229__319_dim125.txt"],
    2001:["NY_20010102_20011231__319_dim247.txt","NY_20010102_20010629__319_dim124.txt","NY_20010702_20011231__319_dim122.txt"],
    2002:["NY_20020102_20021231__319_dim251.txt","NY_20020102_20020628__319_dim123.txt","NY_20020701_20021231__319_dim127.txt"],
    2003:["NY_20030102_20031231__319_dim251.txt","NY_20030102_20030630__319_dim123.txt","NY_20030701_20031231__319_dim127.txt"],
    2004:["NY_20040102_20041231__319_dim251.txt","NY_20040102_20040630__319_dim123.txt","NY_20040701_20041231__319_dim127.txt"],
    2005:["NY_20050103_20051230__319_dim251.txt","NY_20050103_20050630__319_dim124.txt","NY_20050701_20051230__319_dim126.txt"],
    2006:["NY_20060103_20061229__319_dim250.txt","NY_20060103_20060630__319_dim124.txt","NY_20060703_20061229__319_dim125.txt"],
    2007:["NY_20070103_20071231__319_dim250.txt","NY_20070103_20070629__319_dim123.txt","NY_20070702_20071231__319_dim126.txt"],
    2008:["NY_20080102_20081231__319_dim250.txt","NY_20080102_20080630__319_dim124.txt","NY_20080701_20081231__319_dim125.txt"],
    2009:["NY_20090102_20090420__319_dim73.txt"]
}

Sectores = {'10':'Energy','15':'Materials','20':'Industrials','25':'Cons. Discret.','30':'Cons. Staples','35':'Health Care',
 	    '40':'Financials','45':'Inform Technol.','50':'Telecom. Services','55':'Utilities','60':'Real Estate', '95':'Não Classif.'}


def BolsasFile (fname, edgeMax=0.2, maxDim=2, sparse=None, skip=0, cols=[0,1], persLim=0.03, graphShow=False, graphTitle=''):
    
    #pts = smeFileReadNumRand ("/db/Gudhi/TDA-tutorial-master/datasets/tore3D_1307.off", skip=2, nRand=200)
    #pts = smeFileReadNumRand("./Coord30.txt", cols=[1,2], nRand=100)
    #pts = gudhi.read_points_from_off_file(off_file="vDim02_01_to_02_test.txt")
    #pts = [[0.1, 0.2, 0.3, 0.4, 0.5], [0.13, 0.12, 0.23, 0.14, 0.45], [0.23, 0.32, 0.13, 0.04, 0.25], [0.13, 0.32, 0.45, 0.21, 0.34], [0.03, 0.34, 0.25, 0.41, 0.19]]
    #pts = gera2circulos(centros=[[-3,0],[3,0]])
    #pts = gera2esferas(qtPts=500, centros=[[-3,0],[3,0]], ruido=0.0)

    #pts = readDataFileNY(cols=cols, skip=skip)
    #fname = "NY_19890420__20090420__319_dim250.txt"
    #pts = smeFileReadNum(fname, cols=cols, skip=skip)
    vData = bolsaFileRead(fname, cols=cols, skip=skip)
    pts = vData[0]

    #pts = gera2esferas(qtPts=2000, centros=[[-2,0,0],[2,0,0]], raio=1, ruido=0.01)
    pts = np.vstack(pts)
    if graphShow: smeGhudiPlotRipsComplexFromPts(pts, max_edge_length=edgeMax, title=f"Bolsas {graphTitle}")

    for r in range(0, 20, 15):
        x = float(r) / 10
        xx = f"Raio: {x:.2f}" 
        #smeGhudiPlotRipsComplexFromPts(pts, max_edge_length=x, title=xx)
        #plt.show()

    # Cria objecto para guardar RipsComplex
    rc = criaRipsComplex(pts, fname, edgeMax, sparse=sparse, maxDim=maxDim, cols=cols, skip=skip, persLim=persLim)
    rc.infos = vData[1]
    rc.infos[0]['fname']=fname
    rc.vol = rc.infos[0]['vol']
    if graphShow: rc.visualizar_pontos("Pontos")

    rc.barcode = rc.simplex_tree.persistence_intervals_in_dimension(0)

    for d in range(1, rc.maxDim + 1):
        dim_barcode = rc.simplex_tree.persistence_intervals_in_dimension(d)
        rc.barcode = np.vstack([rc.barcode, dim_barcode]) if len(rc.barcode) > 0 else dim_barcode

    # barcodes diagram
    if graphShow: rc.visualizar_diag_persistencia()

    # persistence diagrams
    if graphShow: gudhi.plot_persistence_diagram(rc.persistence)
    #plt.show()

    # Números de Betti:
    rc.numBetti = rc.simplex_tree.betti_numbers()
    print(f"Números de Betti: {rc.numBetti}")
    
    # Cálculo dos buracos:
    rc.holes = rc.findHoles(limiar_persistencia=persLim)
    print(f"Buracos significativos encontrados: {len(rc.holes)}")
    plt.show()

    # Dados
    print(f"Volume: {rc.vol} ; distMédia: {rc.meanDist:.4f} +- {rc.meanDistErr:.4f}")

    return rc


def Bolsas (f1, f2, edgeMax=0.2, maxDim=2, sparse=None, skip=0, cols=[0,1], persLim=0.03, graphShow=True):
    fname = "/db/Economia/DataOrg2026/" + fnames[f1][f2]
    print(f"fname: {fname}")
    rc = BolsasFile (fname, edgeMax, maxDim, sparse, skip, cols, persLim, graphShow)
    return rc


# rc = BolsasGetMat("20-Jan-2005", "10-Feb-2005", "/tmp/Economia", edgeMax=0.2, maxDim=4, sparse=None, skip=0, cols=[0,1,2,3], persLim=0.03) 
def BolsasGetMat (date1, date2, dirOut, edgeMax=0.2, maxDim=2, sparse=None, skip=0, cols=[0,1], persLim=0.03, graphShow=True, delFiles=False):
    fname = runMatlabFromPython(date1, date2, dirOut, delFiles)
    print(f"fname: {fname}")
    rc = BolsasFile (fname, edgeMax, maxDim, sparse, skip, cols, persLim, graphShow)
    return rc


def loopBolsasFromTo_getFiles (tpLoop, f1, f2):

    if not f1 in fnames:
        print("\n  ***** Erro: O primeiro ano que existe é 1989\n")
        return
    
    anos = range(f1, f2+1)
    vFiles = []
    if tpLoop == 'Ano':
        filesAno = [1, 2]
    else:
        filesAno = [0]

    n1 = 0
    for ano in anos:
        if not ano in fnames: break
        lenFAno = len(fnames[ano])
        if tpLoop == 'Ano':
            dic1 = {'N':n1, 'Ano':ano, 'qt':1, 'pos':0, 'file':fnames[ano][0], 'rc':0}
            vFiles.append(dic1)
            n1 += 1
        else:
            if lenFAno > 1: vFiles.append({'N':n1, 'Ano':ano, 'qt':2, 'pos':1, 'file':fnames[ano][1], 'rc':0})
            if lenFAno > 2: vFiles.append({'N':n1+1, 'Ano':ano, 'qt':2, 'pos':2, 'file':fnames[ano][2], 'rc':0})
            n1 += 2

    return vFiles
#
# tpLoop: 'Ano', 'Sem'
# f1:     Primeiro ano
# f2:     Último ano
#
# Retorna um vector de estruturas com todas as informações
#
# vrc = BolsasFromTo('Ano', 1993, 2004, edgeMax=0.2, maxDim=4, sparse=None, skip=0, cols=[0,1,2,3], persLim=0.03)
def BolsasFromTo (tpLoop, f1, f2, edgeMax=0.2, maxDim=2, sparse=None, skip=0, cols=[0,1], persLim=0.03):
    n1 = 0
    vData = loopBolsasFromTo_getFiles (tpLoop, f1, f2)
    dname = "/db/Economia/DataOrg2026/"

    n1 = 0
    for x1 in vData:
        print(f"Ano: {x1['Ano']} ; Qt: {x1['qt']} ; File: {x1['file']}")
        fname = dname + x1['file']
        print(f"fname: {fname}")
        vData[n1]['rc'] = BolsasFile (fname, edgeMax, maxDim, sparse, skip, cols, persLim, graphShow=False)
        n1 += 1

    return vData


# BolsasExecSeq("/db/Economia/DataOrg2026_Testes/DataFiles_Len06_01-Jul-1989_31-Jul-1989.txt", edgeMax=0.2, maxDim=2, sparse=None, skip=0, cols=[0,1], persLim=0.03, graphShow=True):
def BolsasExecSeq (fname, edgeMax=0.2, maxDim=2, sparse=None, skip=0, cols=[0,1], persLim=0.03, graphShow=False):
    f1 = open(fname, "rt")
    if not f1:
        print("***** Erro: Não conseguiu abrir o ficheiro")
        return -1

    linha = f1.readline()
    while linha:
        linha = linha.strip()
        spLine = linha.split("|")
        lenSpLine = len(spLine)
        if lenSpLine != 3:
            print(f"***** Erro a ler o ficheiro '{fname}'")
            return -1
        date1 = spLine[0]
        date2 = spLine[1]
        fname2 = spLine[2]
        title1 = date1 + " - " + date2
        
        print(f"File: {fname2}")
        rc = BolsasFile(fname2, edgeMax=0.2, maxDim=4, sparse=None, skip=0, cols=[0,1,2,3], persLim=0.03, graphShow=graphShow, graphTitle=title1)
        linha = f1.readline()

        
