"""
The Danish folks at La Silla generate funky header names that confuse
common software.  This script fixes them if necessary.
"""

import datetime
import os
import re
import sys

import pyfits

from gavo import api
from gavo import utils
from gavo.helpers import HeaderProcessor, procmain
from gavo.utils import fitstools


class CardFixer(HeaderProcessor):
# Actually, we don't really run like a HeaderProcessor but instead fix
#	the headers in place

	badNameMap = {
		"TEL_FOCUS": "TELFOCUS",
		"FILTER_A": "FILTER_A",
		"FILTER_B": "FILTER_B",
	}

	# La Silla folks left in spurious headers from original integer data
	deleteHeaders = set(["BZERO", "BSCALE"])

	def _createAuxillaries(self, dd):
		self.objectMap = utils.NameMap(os.path.join(dd.rd.resdir, "res/objectmap.txt"))

	def classify(self, srcName):
		hdr = self.getPrimaryHeader(srcName)
		try:
			ignored = "FILTER_A" in hdr
			return "ok"
		except ValueError: # botched cards on board
			return "botched"

	def dissect(self, card):
		mat = re.match(r"([^\s=]*\s*)=([^/]+)(/.*)?$", card._cardimage)
		try:
			key, val, cmt = mat.groups()
		except ValueError:
			key, val = mat.groups()
			cmt = "/"
		return key, int(val), cmt[1:].strip()

	def fixDateObs(self, hdr):
# sometimes the observers just put yyyy-mm-dd into date-obs.  we fix this here
		dateObs = hdr["DATE-OBS"]
		if "T" in dateObs:
			return
		dt = datetime.datetime.strptime(dateObs, "%Y-%m-%d")
		time = datetime.timedelta(seconds=
			(int(hdr["TM_START"])+int(hdr["TM_END"]))/2)
		hdr["DATE-OBS"] = (dt+time).isoformat()

	def getFixedHeader(self, srcName):
		hdr = self.getPrimaryHeader(srcName)
		newCards = []
		for card in hdr.cards:
			if card.key in self.deleteHeaders:
				continue
			try:
				card.verify('exception')
			except pyfits.VerifyError:
				key, val, cmt = self.dissect(card)
				newCards.append(pyfits.Card(self.badNameMap[key.strip()], val, cmt))
			else:
				newCards.append(card)
		newHdr = fitstools.sortHeaders(newCards)
		self.fixDateObs(newHdr)
		newHdr["OBJECT"] = self.objectMap.resolve(newHdr["OBJECT"])
		return newHdr

	def process(self, srcName):
		if self.classify(srcName)=="botched":
			fitstools.replacePrimaryHeaderInPlace(srcName,
				self.getFixedHeader(srcName))


if __name__=="__main__":
	procmain(CardFixer, "danish/red", "import")
