from __future__ import division
from __future__ import absolute_import
from optparse import OptionParser
import csv
import os
import subprocess
import extract_viirs_data as vx
from modules.MetaUtils import readMetadata
from modules.ProcUtils import httpdl
from io import open

def fixDegrees(dm):
    deg = int(dm)
    min = (dm - deg)/ 0.6
    decdeg = deg + min
    return decdeg

if __name__ == "__main__":
    verbose = False
    file = None

    f0 = {'Rrs_412nm': 1708.78, 'Rrs_445nm': 1862.79, 'Rrs_488nm': 1999.76, 'Rrs_555nm': 1869.62, 'Rrs_672nm': 1530.19}
    # Read commandline options...
    version = "%prog 1.0"
    usage = '''usage: %prog [options] FILE

    Requires h5py (http://www.h5py.org/)'''
    parser = OptionParser(usage=usage, version=version)

    parser.add_option("-v", "--verbose", action="store_true", dest="verbose",
        help="Little Miss Chatterbox...",
    )

    (options, args) = parser.parse_args()

    if len(args):
        file = args[0]

    if options.verbose:
        verbose = options.verbose

    if file is None or len(args) != 1:
        parser.print_help()
        exit(0)

    outfile = open('edrvalidation.csv', 'w')

    firstRun = True
    with open(file, 'r') as f:
        reader = csv.reader(f)
        fields = None
        for row in reader:
            if row[0] == "/fields=id":
                row[0] = "id"
                fields = row
            if row[0] == "/end_header":
                break
        reader = csv.DictReader(f, fieldnames=fields)

        for row in reader:
            edrData = {}
            l2file = '.'.join([row["file_name"].split(".L2")[0], "L2_NPP_OC"])

            compressed_l2file = '.'.join([l2file, "bz2"])
            url = '/'.join(["http://oceandata101:8080/cgi/gethiddenfile", compressed_l2file])
            dlstat = httpdl(url, uncompress=True)
            if dlstat:
                continue
            meta = readMetadata(l2file)
            svmFile = meta["Input Files"].split(',')[0]
            edrFile = (svmFile.replace("SVM01", "VOCCO")).replace("obpg", "noaa")
            compressed_edrFile = '.'.join([edrFile, 'bz2'])
            url = '/'.join(["http://oceandata101:8080/cgi/gethiddenfile", compressed_edrFile])
            dlstat = httpdl(url, uncompress=True)
            if dlstat:
                os.remove(l2file)
                continue
            else:
                latitude = fixDegrees(float(row["latitude"]))
                longitude = fixDegrees(float(row["longitude"]))

                lonlatcmd = ['lonlat2pixline', l2file, row["longitude"], row["latitude"]]
                pixlinestr = subprocess.Popen(lonlatcmd, stdout=subprocess.PIPE).communicate()[0]
                pixel = None
                line = None
                for ll2pxln in pixlinestr.splitlines():
                    elems = ll2pxln.split("=")
                    if elems[0] == 'sline':
                        line = int(elems[1])
                    if elems[0] == 'spixl':
                        pixel = int(elems[1])

                if pixel and line:
                    edrEx = vx.viirsExtract(file=edrFile,
                        pixel=pixel,
                        line=line,
                        verbose=verbose
                    )

                    edrData = edrEx.dataExtractor(edrFile)
                    row.update(edrData)
                    rrsData = {}
                    for edr in edrData:
                        if edr.startswith("nLw"):
                            rrs = edr.replace("nLw", "Rrs")
                            if edrData[edr] == -999.:
                                rrsData[rrs] = -999.
                            else:
                                rrsData[rrs] = edrData[edr]/ f0[rrs]
                    row.update(rrsData)

                    writer = None
                    if firstRun:
                        fields += sorted(edrData.keys())
                        fields += sorted(rrsData.keys())

                    writer = csv.DictWriter(outfile, fieldnames=fields)
                    if firstRun:
                        writer.writeheader()
                        firstRun = False

                    writer.writerow(row)

                os.remove(l2file)
                os.remove(edrFile)
    outfile.close()

