"""
A grammar to read processed slit spectra from Dominique Sluse
"""

import os

from gavo.base import coords
from gavo.utils import pyfits
from gavo.grammars.customgrammar import CustomRowIterator


class RowIterator(CustomRowIterator):
	def _getWCSMapper(self, refPix, refVal, cDelt):
		def map(val):
			return (val-refPix)*cDelt+refVal
		return map

	def _getWavelengthMapper(self, header):
		return self._getWCSMapper(header["CRPIX1"], header["CRVAL1"],
			header["CDELT1"])

	def _iterRows(self):
		flux = pyfits.open(self.sourceToken)[0]
		errors = pyfits.open(self.sourceToken.replace("_data", "_err"))[0]
		baseName = os.path.basename(self.sourceToken)
		stem = baseName[:baseName.find(".")]

		baseMeta = dict(flux.header)
		baseMeta["parser_"] = self

		transform = coords.getWCS(flux.header, naxis=(2,3)).wcs_pix2world
		mapWL = self._getWavelengthMapper(baseMeta)

		for rowInd in range(baseMeta["NAXIS2"]):
			ra, dec = transform((rowInd,), (0,), 0)
			newRow = baseMeta.copy()
			obsId = "%s-%02d"%(stem, rowInd)
			newRow["obsId"] = obsId
			newRow["RA"], newRow["DEC"] = ra, dec
			newRow["pixno"] = rowInd
			newRow["MJD_OBS"] = newRow["MJD-OBS"]
			yield ("metadata", newRow)
			yield ("products", newRow)

			for specInd in range(baseMeta["NAXIS2"]):
				yield ("fluxes", {
					"obsId": obsId,
					"lambda": mapWL(specInd),
					"flux": flux.data[0, specInd, rowInd],
					"error": errors.data[0, specInd, rowInd]})
