#!/usr/bin/python3

import argparse
import datetime
import json
import logging
import pkg_resources  # part of setuptools
import sys

import numpy as np

from tart_tools import api_handler
from tart.imaging import elaz

from disko import fov, get_source_list

logger = logging.getLogger()

if __name__ == '__main__':

    parser = argparse.ArgumentParser(description='Draw and visualize discrete fields of view',
                                     formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('filename', help="The HDF5 field of view file")

    parser.add_argument('--catalog', required=False,
                        default='https://tart.elec.ac.nz/catalog', help="Catalog API URL.")

    parser.add_argument('--show-sources', action="store_true",
                        help="Show known sources on images (only works on PNG & SVG).")
    parser.add_argument('--elevation',
                        type=float, default=20.0,
                        help="Elevation limit for displaying sources (degrees).")

    parser.add_argument('--PNG', default=None,
                        help="Generate a PNG format image.")
    parser.add_argument('--PDF', default=None,
                        help="Generate a PDF format image.")
    parser.add_argument('--SVG', default=None,
                        help="Generate a SVG format image.")
    parser.add_argument('--VTK', default=None,
                        help="Generate a VTK mesh format image.")
    parser.add_argument('--FITS', default=None,
                        help="Generate a FITS format image.")

    parser.add_argument('--display', action="store_true",
                        help="Display the field of view")
    parser.add_argument('--version', action="store_true",
                        help="Display the current version")

    ARGS = parser.parse_args()

    logger.setLevel(logging.INFO)

    field_of_view = fov.from_hdf(ARGS.filename)
    ts = field_of_view.timestamp
    geo = field_of_view.geolocation
    logger.info(f"geo {geo}")
    
    if ARGS.version:
        version = pkg_resources.require("spotless")[0].version
        print(f"disko_draw: Version {version}")
        print("             (c) 2022 Tim Molteno")
        sys.exit(0)

    src_list = None
    if ARGS.show_sources:
        api = api_handler.APIhandler("")
        cat_url = api.catalog_url(lon=geo.lon.to_value('deg'),
                                  lat=geo.lat.to_value('deg'),
                                  datestr=ts.isoformat())
        logger.info(f"catalog url: {cat_url}")
        source_json = api.get_url(cat_url)
        src_list = get_source_list(source_json, el_limit=5, jy_limit=1e4)
        # print("Source list")
        # for s in src_list:
        #     print(f"   src: el:{np.degrees(s.el_r) :5.2f}")
        
    if ARGS.VTK:
        field_of_view.write_mesh(ARGS.VTK)

    if ARGS.FITS:
        field_of_view.to_fits(fname=ARGS.FITS, info={'creator': 'disko_draw'})

    if ARGS.SVG:
        field_of_view.to_svg(fname=ARGS.SVG, src_list=src_list, show_grid=True, title="")
        print(f"Writing SVG: {ARGS.SVG}")

    if ARGS.PNG:
        fname = path('png', image_title)
        plt.figure()
        field_of_view.plot(plt, None)
        plt.tight_layout()
        plt.savefig(ARGS.PNG, dpi=300)
        plt.close()

    if ARGS.PDF:
        field_of_view.plot(plt, None)
        plt.savefig(ARGS.PDF, dpi=600)
        plt.close()

    if ARGS.display:
        field_of_view.plot(plt, None)
        plt.show()
