#!/usr/bin/env python3
import itertools
import os
import sys
import Core.FindData
import Core.System as Sys
import MCPL as mcpl

files=['miscphys.mcpl.gz','gammas_uw.mcpl.gz','reffile_3.mcpl','reffile_10.mcpl','reffile_13.mcpl','reffile_14.mcpl',
       'difficult_unitvector.mcpl.gz','reffile_crash.mcpl',
       'reffile_empty.mcpl.gz','reffile_userflags_is_pos.mcpl.gz','reffile_uw.mcpl.gz']
files = ['$SBLD_DATA_DIR/MCPLTests/%s'%f for f in files]
files += ['$SBLD_DATA_DIR/MCPLTests/reffile_14.mcpl']

filecombinations = list(itertools.chain( itertools.combinations( files, 2 ),#all 2 input files combinations
                                         itertools.islice( itertools.combinations( files, 3 ), 0, None, 17 ),#Every 17th combination with 3 input files
                                         iter([(files[0], files[0]),(files[1], files[1]),(files[2], files[2])]),#duplicated input (triggers WARNING + non-forced merge)
                                         ))

def run(cmd):
    sys.stdout.flush()
    sys.stderr.flush()
    Sys.system_throw(os.path.expandvars(cmd)+' | sed "s#"%s"#<SBLD_DATA_DIR>#"'%Sys.quote(os.environ['SBLD_DATA_DIR']))
    sys.stdout.flush()
    sys.stderr.flush()


for i,filelist in enumerate(filecombinations):
    keepuf = bool(i%3==0)
    #Decode info about input files:
    inputcounts = []
    expected_uf = False
    expected_pol = False
    expected_dp = False
    input_univpdg = []
    input_univw = []
    for f in filelist:
        with mcpl.MCPLFile(os.path.expandvars(f)) as m:
            inputcounts += [m.nparticles]
            if m.nparticles>0:
                input_univpdg += [m.opt_universalpdgcode]
                input_univw += [m.opt_universalweight]
                if m.opt_polarisation:
                    expected_pol = True
                if not m.opt_singleprec:
                    expected_dp = True
                #userflags are kept when --keepuserflags is set or input files are compatible;
                if m.opt_userflags and (keepuf or len(set(filelist))==1):
                    expected_uf = True
    expected_univpdg = input_univpdg[0] if len(set(input_univpdg))==1 else 0
    expected_univw = input_univw[0] if len(set(input_univw))==1 else 0.0



    Sys.rm_f('tmp.mcpl')
    cmd=Sys.quote_cmd(['sb_mcpl_tool','--forcemerge','tmp.mcpl']+list(filelist))
    if keepuf:
        cmd+=' --keepuserflags'
    print('\n\n\n\n\nRUNNING: %s'%cmd,flush=True)
    run(cmd)
    with mcpl.MCPLFile('tmp.mcpl') as res:
        res.dump_hdr()
        if sum(inputcounts)<30:
            res.dump_particles(limit=0)
        else:
            for skip in [0]+inputcounts[:-1]:
                res.dump_particles(limit=10,skip=max(0,skip-5))
        assert res.opt_userflags==expected_uf,"unexpected user flags setting"
        assert res.opt_polarisation==expected_pol,"unexpected polarisation setting"
        assert res.opt_singleprec==(not expected_dp),"unexpected singleprec setting"
        assert res.opt_universalpdgcode==expected_univpdg,"unexpected universalpdgcode setting"
        assert res.opt_universalweight==expected_univw,"unexpected universalweight setting"
