#!/usr/bin/python3 -Wignore
"""Starbug2 Matching
usage: starbug2-match [-Bhv] [-o output] [-p file.param] [-s KEY=VAL] table.fits ...
    #-B  --bandmatch          : match in "BAND" mode (wavelength specific)
    -h  --help               : show help message
    -o  --output  file.fits  : output matched catalogue
    -p  --param   file.param : load starbug parameter file
    -s  --set     option     : set value in parameter file at runtime (-s MATCH_THRESH=1)
"""

import os,sys,getopt,glob
import pkg_resources
from astropy.io import fits
from astropy.table import Table, hstack
import starbug2
from starbug2 import utils
from starbug2 import matching

VERBOSE=0x01
KILLPROC=0x02

BANDMATCH=0x04

options=0

parameter={}
pfile=None
output=None
setdict={}

def usage():
    if options& VERBOSE: quit(__doc__)
    else: quit( __doc__.split("\n")[1])

opts,args=getopt.getopt(sys.argv[1:], "Bhvo:p:s:", ("bandmatch","help","verbose",
                                                "output=", "param=", "set="))

for opt,optarg in opts:
    if opt in ("-h", "--help"): usage()
    if opt in ("-v", "--verbose"): options|=VERBOSE
    if opt in ("-o", "--output"): output=optarg
    if opt in ("-p", "--param"): pfile=optarg

    if opt in ("-s","--set"): 
        if '=' in optarg:
            key,val=optarg.split('=')
            try: val=float(val)
            except: pass
            setdict[key]=val

        else: perror("unable to set parameter, use syntax -s KEY=VALUE\n")

    if opt in ("-B","--bandmatch"): options|=BANDMATCH

if not len(args): usage()

if pfile: parameters=utils.load_params(pfile)
elif os.path.exists("./starbug.param"): parameters=utils.load_params("./starbug.param")
else: parameters=utils.load_params("%s/default.param"%pkg_resources.resource_filename("starbug2", "param/"))

if parameters: parameters.update(setdict)
else: 
    utils.perror("failed to load parameter file\n")
    quit("..quitting :(")

tables=[Table.read(fname,format="fits") for fname in args]

colnames=starbug2.match_cols
colnames+=[ name for name in parameters["MATCH_COLS"].split() if name not in colnames]

if options & BANDMATCH:
    matched=matching.band_match(tables,parameters["MATCH_THRESH"],colnames)
    utils.export_table(matched,fname="out.fits")

else:
    av,full=matching.generic_match(tables, parameters["MATCH_THRESH"], colnames)
    av.meta.update(tables[0].meta)

    utils.printf("->out*.fits\n")
    utils.export_table(hstack((av,full)),fname="out-full.fits")
    utils.export_table(av,fname="out.fits")
