"""
**PROGRAM**
    gps_day_station_export.py

**PURPOSE**
    Export valid stations for a given GPS day from the GipsyX StationDataBase 
    to a JSON/text file and a KMZ file for global visualization.

**USAGE**
    python gps_day_station_export.py --date 2024-01-17
    python gps_day_station_export.py --date 2024-01-17 --station_db /path/to/db
    python gps_day_station_export.py --date 2024-01-17 --station_list_db stations.txt
"""

import argparse
import json
import os
import sys
from typing import Optional

import numpy as np

try:
    import simplekml
    _KML_AVAILABLE = True
except ImportError:
    _KML_AVAILABLE = False

try:
    from gcore.StationDataBase import StationDataBase
    from gcore.dateUtils import cal2sec
except ImportError:
    print("ERROR: Could not import gcore modules. Please ensure GipsyX environment is configured.")
    sys.exit(1)

def export_stations(
    date: str,
    station_db: Optional[str] = '$GOA_VAR/sta_info/sta_db_qlflinn',
    station_list_db: Optional[str] = None,
    output_dir: str = '.',
):
    """
    Retrieve valid stations from StationDataBase for a given date and export to JSON and KMZ.
    """
    # 1. Resolve paths and epoch
    resolved_db_path = os.path.expandvars(station_db)
    y2k_epoch = cal2sec(date)
    
    # Parse station list if provided
    parsed_sta_list = None
    if station_list_db:
        resolved_sta_list_path = os.path.expandvars(station_list_db)
        try:
            with open(resolved_sta_list_path, 'r') as f:
                parsed_sta_list = [line[:4] for line in f if line.strip()]
        except Exception as e:
            print(f"[Export] WARNING: Could not parse station list file {resolved_sta_list_path}: {e}")

    # 2. Initialize StationDataBase
    db = StationDataBase(dataBase=resolved_db_path, t=y2k_epoch, staList=parsed_sta_list)
    
    # 3. Get valid stations for the epoch
    stations = db.getValidStations(y2k_epoch)
    if not stations:
        print(f"[Export] No valid stations found for date {date}.")
        return

    # 4. Get coordinates
    lats, lons, heights = db.dumpLatLonHeights(stations)
    
    # 5. Prepare data
    station_data = []
    for stn, lat, lon, h in zip(stations, lats, lons, heights):
        station_data.append({
            "name": stn,
            "lat": lat,
            "lon": lon,
            "height": h
        })
    
    # 6. Write JSON output
    os.makedirs(output_dir, exist_ok=True)
    json_path = os.path.join(output_dir, f"gps_day_{date}_stations.json")
    with open(json_path, 'w') as f:
        json.dump(station_data, f, indent=2)
    
    # 7. Write Text output (simple list)
    txt_path = os.path.join(output_dir, f"gps_day_{date}_stations.txt")
    with open(txt_path, 'w') as f:
        f.write(f"# Stations valid for GPS day {date}\n")
        f.write(f"# Name  Lat  Lon  Height\n")
        for s in station_data:
            f.write(f"{s['name']:<4} {s['lat']:10.4f} {s['lon']:10.4f} {s['height']:10.2f}\n")

    print(f"[Export] Exported {len(station_data)} stations to:")
    print(f"  - {json_path}")
    print(f"  - {txt_path}")

    # 8. Write KMZ output
    if not _KML_AVAILABLE:
        print("[KMZ] WARNING: simplekml not installed. Skipping KMZ export.")
    else:
        kmz_path = os.path.join(output_dir, f"gps_day_{date}_stations.kmz")
        kml = simplekml.Kml()
        for s in station_data:
            # coords = [(lon, lat, alt)]
            kml.newpoint(name=s['name'], coords=[(s['lon'], s['lat'], s['height'])])
        
        kml.savekmz(kmz_path)
        print(f"  - {kmz_path}")

def main():
    parser = argparse.ArgumentParser(
        description="Export valid GipsyX stations for a GPS day to JSON, TXT, and KMZ.",
        formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument(
        "--date", required=True, metavar="YYYY-MM-DD",
        help="Target calendar date."
    )
    parser.add_argument(
        "--station_db", default='$GOA_VAR/sta_info/sta_db_qlflinn',
        help="Path to the GipsyX StationDataBase file. (default: $GOA_VAR/sta_info/sta_db_qlflinn)"
    )
    parser.add_argument(
        "--station_list_db", default=None,
        help="Path to a list of station names (staList)."
    )
    parser.add_argument(
        "--output-dir", default=".",
        help="Directory for output files (default: current directory)."
    )

    args = parser.parse_args()
    
    export_stations(
        date=args.date,
        station_db=args.station_db,
        station_list_db=args.station_list_db,
        output_dir=args.output_dir
    )

if __name__ == "__main__":
    main()
