#!/usr/bin/env python3
import numpy as np
import argparse
import sys
from os.path import abspath, expanduser
import os
sys.path.insert(0, os.path.abspath('..'))
from specdal.spectrum import Spectrum
from specdal.reader import read

parser = argparse.ArgumentParser(description='SpecDAL Info')

# io options
parser.add_argument('input_files', metavar='FILE', nargs='+',
                    action='store', type=str,
                    help='input directory containing input files')
parser.add_argument('--raw', action='store_true', default=False,
                    help='output raw dataframe and metadata and exit')
parser.add_argument('--list_measure_types', action='store_true', default=False,
                    help='list measurement types and exit')
parser.add_argument('--list_metadata_fields', action='store_true', default=False,
                    help='list metadata fields and exit')
parser.add_argument('--measure_type', # choices=['pct_reflect',
                                      #          'tgt_count',
                                      #          "ref_count",
                                      #          "tgt_radiance",
                                      #          "ref_radiance",
                                      #          "tgt_irradiance",
                                      #          "ref_irradiance",
                                      #          "tgt_reflect",
                                      #          "ref_reflect"],
                    default='pct_reflect',
                    help='type of measurement to read')
parser.add_argument('--metadata', metavar='FIELD', nargs='*',
                    help='specify metadata fields to display')
parser.add_argument('-n', '--N', type=int, default=2,
                    help='number of spectra to display from head and tail')
# misc
parser.add_argument('-d', '--debug', action='store_true')
args = parser.parse_args()
if args.debug:
    print('args = {}'.format(args))

################################################################################
# main
################################################################################

for f in args.input_files:
    assert os.path.isfile(f)
    print('\n\n'+'-'*80)
    print('{:<20}\t{}\n'.format('file:', f))

    if args.list_measure_types or args.list_metadata_fields or args.raw:
        data, meta = read(f)
        if args.raw:
            assert 2*args.N < data.shape[0]
            #print('{}\n{}'.format('data:', data.iloc[np.r_[0:args.N, -args.N:0]]))
            print('{}\n{}'.format('data:', data.iloc[0:args.N].to_string(col_space=10)))
            print('{}\n{}'.format('...', data.iloc[-args.N:].to_string(
                header=None, index_names=False, col_space=10)))
            print('metadata:')
            for key, item in meta.items():
                print('  {:<20}\t{}'.format(key+':', item))
            continue
        if args.list_measure_types:
            print('{:<20}\t{}'.format('measure_types: ', data.columns.values))
        if args.list_metadata_fields:
            print('{:<20}\t{}'.format('metadata_fields: ', list(meta.keys())))
        continue

    s = Spectrum(name=f, filepath=f, measure_type=args.measure_type)

    assert 2*args.N < s.measurement.size

    print('{:<20}\t{}'.format('measure_type:', s.measure_type))
    print('{:<20}'.format('metadata:'))
    for i, (key, item) in enumerate(s.metadata.items()):
        if args.metadata is not None:
            if key not in args.metadata:
                continue
        print('  {:<20}\t{}'.format(key+':', item))
    print('{:<20}'.format('data:'))
    print('{:>2}'.format(s.measurement.iloc[0:args.N].to_string()))
    print('...\n{}'.format(s.measurement.iloc[-args.N:].to_string(header=None)))
