#!/usr/bin/env fslpython
#   Copyright (C) 2016 University of Oxford 
#   SHBASECOPYRIGHT
import argparse
import numpy as np
import os
import sys

fsldir = os.getenv('FSLDIR')
sys.path.append(fsldir + '/python/mist')
import showscalars

ap = argparse.ArgumentParser(description = 'Show scalars on mesh')

sps = ap.add_subparsers(dest = 'verb', help = 'Mode')

sp_simple = sps.add_parser('simple', help = 'Show scalars with specified range')
sp_simple.add_argument('mesh', help = 'Filename of input mesh')
sp_simple.add_argument('scalars', help = 'Filename of scalars')
sp_simple.add_argument('lowerlimit', type = float, help = 'Lower limit of colour scale')
sp_simple.add_argument('upperlimit', type = float, help = 'Upper limit of colour scale')

sp_pvals = sps.add_parser('pvals', help = 'Show pvals')
sp_pvals.add_argument('mesh', help = 'Filename of input mesh')
sp_pvals.add_argument('scalars', nargs = '+', help = 'Filenames of scalars (two files; first is positive contrast, second is optional negative contrast)')

sp_noscalars = sps.add_parser('noscalars', help = 'Just show mesh')
sp_noscalars.add_argument('mesh', help = 'Filename of input mesh')

args = ap.parse_args()

if args.verb == 'simple':
    showscalars.display([showscalars.getactor(showscalars.readmesh(args.mesh), showscalars.readscalars(args.scalars), args.lowerlimit, args.upperlimit)])
elif args.verb == 'pvals':
    if len(args.scalars) == 1:
        scalars = showscalars.readpvals(args.scalars[0])
        showscalars.display([showscalars.getactor(showscalars.readmesh(args.mesh), scalars, 0.0, 0.05, showscalars.p_lut())], pvals = True)
    else:
        scalars = showscalars.readpvals(args.scalars[0], args.scalars[1])
        showscalars.display([showscalars.getactor(showscalars.readmesh(args.mesh), scalars, -0.025, 0.025, showscalars.p_lut_twosided())],
                            pvals = True, twosided = True)
elif args.verb == 'noscalars':
    mesh = showscalars.readmesh(args.mesh)
    showscalars.display([showscalars.getactor(mesh, np.ones(mesh.GetNumberOfPoints()), 1.0, 1.0)])


