# apfscore adapted to work on hipparcos objects; here, we add a warning
# about multiple stars if appropriate.

from gavo import api

apfscore, _ = api.loadPythonModule("apfscore", relativeTo=__file__)


class Core(apfscore.BaseCore):
	inputTableXML = apfscore.INPUT_TABLE_XML_TEMPLATE.format(
		objectDescription="Enter a Hipparcos catalogue number, or a"
					" (decimal, comma-separated) position or simbad identifier to"
					" use the closest Hipparcos star.",
		objectDefault="30438")
	sourceCatName = "HIPPARCOS"
	sourceCatId = "hipparcos/q#main"
	catalogueEpoch = 2448349.0625
	useLegacy = False

	def getLegacyAstrometry(self, hipno, inputTable):
		with api.getTableConn() as conn:
			return list(
				conn.query("""
					select degrees(sixvec[1]) as alpha,
						degrees(sixvec[2]) as delta,
						degrees(sixvec[4])*3.6e6 as mu_alpha,
						degrees(sixvec[5])*3.6e6 as mu_delta,
						sixvec[3]/1000 as parallax, 0 as rv,
						MultFlag FROM (
							SELECT epoch_prop(spoint(radians(ra), radians(dec)),
								parallax*3.6e6,
								radians(pmra), radians(pmde),
								NULL, 2000-1991.25) AS sixvec,
								MultFlag
							FROM hipparcos.main WHERE hipno=%(star)s) AS q""",
					{"star": hipno}))[0]

	def query(self, hipno, inputTable):
		if self.useLegacy:
			self.catalogueEpoch = 2451545.0
			res = self.getLegacyAstrometry(hipno, inputTable)
		else:
			with api.getTableConn() as conn:
				res = list(
					conn.query("""
						SELECT ra, dec, pmra*3.6e6, pmde*3.6e6,
							parallax*3600, 0 as rv, MultFlag
						FROM hipparcos.main WHERE hipno=%(star)s""",
						{"star": hipno}))[0]

		# handle multflag locally
		if res[-1].strip():
			inputTable.addMeta("multiple", "Yes")
	
		return res[:-1]


def _test():
	import datetime
	from gavo.formats import texttable #noflake: for registration
	import sys

	rd = api.getRD("apfs/res/apfs_new")
	svc = rd.getById("catquery")
	api.formatData("tsv",
		svc.run("form", {
				"startDate": datetime.date(2010, 11, 12),
				"endDate": datetime.date(2010, 11, 17),
				"hrInterval": 12,
				"object": "Algol",
			}),
		sys.stdout)


if __name__=="__main__":
	_test()
