from __future__ import division

import os
import collections
import datetime

import numpy

from gavo import api
from gavo.grammars import columngrammar
from gavo.helpers import fitstricks
from gavo.rscdef import rmkfuncs
from gavo.utils import pyfits
from gavo import votable


class MyProcessor(api.AnetHeaderProcessor):
	sp_indices = ["index-209.fits"]
	sp_endob = 200
	sp_total_timelimit = 200
	sexControl = """DETECT_THRESH    5
		SEEING_FWHM      1.2
		WEIGHT_TYPE BACKGROUND
		BACK_SIZE 50
		BACK_FILTERSIZE 5x5
		"""
	sexControlCrowded = """FILTER N
		DETECT_THRESH    5
		DETECT_MINAREA 500
		BACKPHOTO_TYPE LOCAL
		SEEING_FWHM      1.2
		WEIGHT_TYPE BACKGROUND
		BACK_SIZE 50
		BACK_FILTERSIZE 10x10
		"""

	@staticmethod
	def addOptions(optParser):
		api.AnetHeaderProcessor.addOptions(optParser)
		optParser.add_option("--crowded", action="store_true",
			help="Do source extraction on crowded fields",
			dest="crowded")
		optParser.add_option("--no-object-filter", action="store_true",
			help="Do not discard oddly shaped objects or objects near the border.",
			dest="noObjectFilter")

	def _createAuxiliaries(self, dd):
		self.metadata = {}
		# gather wfpdbids
		wfpdbids = set()
		for source in dd.rd.getById("import").sources:
			wfpdbid = source[-18:-5].replace("_", " ")
			wfpdbids.add(wfpdbid)

		query = """
			SELECT * FROM wfpdb.main
			WHERE wfpdbid IN ({0})
		""".format(",".join(map(
			# quote escaping and _ to blank
			lambda x: "'{0}'".format(x.replace("'", "''")),
			wfpdbids
		)))

		res = votable.ADQLSyncJob("http://dc.g-vo.org/tap", query).run()
		data, metadata = votable.load(res.openResult())

		for row in metadata.iterDicts(data):
			self.metadata[row["wfpdbid"]] = row

		if self.opts.crowded:
			self.sexControl = self.sexControlCrowded

		if self.opts.noObjectFilter:
			del self.__class__.objectFilter

	def objectFilter(self, inName):
		"""throws out funny-looking objects from inName and throws out objects
		near the border.
		"""
		hdulist = pyfits.open(inName)
		data = hdulist[1].data
		width = max(data.field("X_IMAGE"))
		height = max(data.field("Y_IMAGE"))
		badBorder = 0.05
		data = data[data.field("ELONGATION")<1.2]
		data = data[data.field("X_IMAGE")>width*badBorder]
		data = data[data.field("X_IMAGE")<width-width*badBorder]
		data = data[data.field("Y_IMAGE")>height*badBorder]
		data = data[data.field("Y_IMAGE")<height-height*badBorder]
		hdu = pyfits.BinTableHDU.from_columns(numpy.array(data))
		hdu.writeto("foo.xyls")
		hdulist.close()
		os.rename("foo.xyls", inName)

	def _mungeHeader(self, srcName, hdr):
		wfpdbid = os.path.basename(srcName)[:13].replace("_", " ")
		rec = self.metadata[wfpdbid]

		rec["date_obs"] = api.jYearToDateTime(rec["epoch"])

		nhdr = {
			"COORFLAG":{"M": "missing", "U": "uncertain"
				}.get(rec["coord_problem"], None),
			"OBJECT":rec["object"],
			"OBSERVAT":"Harvard-Boyden St.Bloemfontein",
			"SITENAME":"Bloemfontein",
			"SITELONG":26.4058,
			"SITELAT":-28.8751,
			"SITEELEV":1407,
			"TELESCOP":"32/36\" Baker Schmidt (ADH)",
			"TELSCALE":68,
			"DETNAME":"Photographic Plate",
			"FILTER":rec["filter"] if rec["filter"] != "no" else "clear",
			"OBSERVER":rec["observer"],
			"PQUALITY":rec["quality"],
			"PLATENUM":wfpdbid[7:12],
			"WFPDB_ID":wfpdbid,
			"PLATEFMT":"16x16",
			"PLATESZ1":rec["xsize"],
			"PLATESZ2":rec["ysize"],
			"FOV1":abs(hdr["CD1_1"]) * hdr["NAXIS1"],
			"FOV2":abs(hdr["CD2_2"]) * hdr["NAXIS2"],
			"EMULSION":rec["emulsion"] if rec["emulsion"] != "no" else None,
			"DATE_OBS":rec["date_obs"].strftime("%Y-%m-%dT%H:%M:%S"),
			"DATE_AVG":(rec["date_obs"] + datetime.timedelta(
				seconds = float(rec["exptime"]) * 60 / 2)).strftime(
				"%Y-%m-%dT%H:%M:%S"),
			"DATE_END":(rec["date_obs"] + datetime.timedelta(
				seconds = float(rec["exptime"]) * 60)).strftime("%Y-%m-%dT%H:%M:%S"),
			"EXPTIME":float(rec["exptime"]),
			"JD":api.dateTimeToJdn(rec["date_obs"]),
			"RA_DEG":rec["raj2000"],
			"DEC_DEG":rec["dej2000"],
			"SCANRES1":2400,
			"SCANRES2":2400,
			"PIXSIZE1":10.58,
			"PIXSIZE2":10.58,
			"SCANSOFT":"VueScan",
			"SCANGAM":1,
			"SCANFOCUS":"Glass",
			"SCANAUTH":"Milcho Tsvetkov",
			"OBSNOTES":rec["notes"].split("\t")[-1],
			"RA_ORIG":rec["raj2000"],
			"DEC_ORIG":rec["dej2000"],
		}

		return fitstricks.makeHeaderFromTemplate(fitstricks.WFPDB_TEMPLATE,
			originalHeader=hdr, **nhdr)


if __name__=="__main__":
	api.procmain(MyProcessor, "boydende/q", "import")
