from pyscescbm.CBVersion import __DEBUG__, __version__
from pyscescbm import CBRead, CBWrite, CBTools
from pyscescbm import CBSolver as slv

work_dir = os.path.join(cDir, work_dir)
if not os.path.exists(work_dir):
    os.mkdir(work_dir)

if sbml_level == 3:
    print('Trying level 3')
    cmod = CBRead.readSBML3FBC(model_file, work_dir=model_dir)
else:
    cmod = CBRead.readSBML2FBA(model_file, work_dir=model_dir)
cmod.id = model_name

slv.analyzeModel(cmod, lpFname=os.path.join(work_dir, 'raw_({0:s})'.format(cmod.id)))

# scan for duplicates
print('\nScan for duplicates')
dup_C = CBTools.scanForReactionDuplicates(cmod, ignore_coefficients=False)
print('\nReaction pairs with matching reagents and coefficients: {0:d}'.format( len(dup_C) ))
for d in dup_C:
    print('{0:s} == {1:s} ({2:s})'.format(d[0],d[1],d[2]))

# write duplicate reactions to file
F = open(os.path.join(model_dir,'{0:s}.duplicates.csv'.format(model_file)),'w')
F.write('Model file: {0:s},,,,\n'.format( model_file) )
F.write('Duplicate reactions pairs: {0:d},,,,\n'.format( len(dup_C) ) )
for d in dup_C:
    F.write('\"{0:s}\",\"{1:s}\",\"{2:s}\",\"{3:s}\",\"{4:s}\"\n'.format(d[0],d[1],d[2],d[3],d[4]))
F.write('\n')
work_dir2 = os.path.join(data_dir,'models','h-format')

if not os.path.exists(work_dir2):
    os.makedirs(work_dir2)

if sbml_level == 3:
    print('Trying level 3')
    cmod = CBRead.readSBML3FBC(model_file, work_dir=model_dir)
else:
    cmod = CBRead.readSBML2FBA(model_file, work_dir=model_dir)

cmod.id = model_name
print('\nAttempting to delete bounds for biomass reaction,', cmod.getActiveObjective().getFluxObjectiveReactions()[0])
cmod.deleteBoundsForReactionId(cmod.getActiveObjective().getFluxObjectiveReactions()[0])

mLP = slv.analyzeModel(cmod, return_lp_obj=True)
CBWrite.printFBASolution(cmod)
tmp_mid = cmod.id+'_cplex'

CBTools.countedPause(1)

cmod.id = tmp_mid

print('\n{0:d}\n'.format(len(cmod.flux_bounds)) )
cmod.changeAllFluxBoundsWithValue(inf_bound, 'Infinity')
cmod.changeAllFluxBoundsWithValue(-inf_bound, '-Infinity')
cmod.changeAllFluxBoundsWithValue(numpy.inf, 'Infinity')
cmod.changeAllFluxBoundsWithValue(-numpy.inf, '-Infinity')

print('\n{0:d}\n'.format(len(cmod.flux_bounds)) )
slv.analyzeModel(cmod, lpFname=os.path.join(work_dir2, cmod.id), oldlpgen=False)
    """
    write calculate module to a csv file
    """
    file_path = os.path.join(modules_dir,"modules.txt")
    file_out = open(file_path,"w")        
    for module in flux_modules:
        if len(module) > 1:       # modules should contain more than one reaction
            for item in module[:-1]:
               file_out.write("{0}, ".format(item))
            file_out.write("{0}\n".format(module[-1]))
    file_out.close()

if not os.path.exists(work_dir2):
    os.makedirs(work_dir2)

if sbml_level == 3:
    print('Trying level 3')
    cmod = CBRead.readSBML3FBC(model_file, work_dir=model_dir)
else:
    cmod = CBRead.readSBML2FBA(model_file, work_dir=model_dir)
    
if solver.upper() == "CPLEX":
    fva_dat, fva_names = CBMultiCore.runMultiCoreFVA(cmod,procs=ncores)       
elif solver.upper() == "GLPK":
    fva_dat,fva_names = slv.glpk_FluxVariabilityAnalysis(cmod)    
else: 
    fva_dat, fva_names = CBMultiCore.runMultiCoreFVA(cmod,procs=ncores)     
    
lst_flux_modules = fmod.computeModules(cmod,tol=tolerance)    
writeModule2CSV(lst_flux_modules)