#!/usr/bin/env python3
"""
MosaicEarth Hybrid Local + Cloud CLI (mosaicearth-cli v2.1)
Supports:
  1. Local-first storage & local NodeODM processing (http://127.0.0.1:3000 at 0 EUR)
  2. Signing in with your MosaicEarth account (--email / --password) to:
     - Sync local files into MyEarth (Project -> Survey -> Task -> Asset)
     - Request a Cloud GPU processing quote (--quote-images N)
"""
import argparse
import json
import os
import sys
import urllib.request

DEFAULT_URL = os.environ.get("MOSAICEARTH_URL", "https://next.mosaicearth.app")
DEFAULT_LOCAL_ODM = os.environ.get("MOSAICEARTH_LOCAL_NODEODM", "http://127.0.0.1:3000")

def api_post(url: str, payload: dict) -> dict:
    req = urllib.request.Request(
        url,
        data=json.dumps(payload).encode("utf-8"),
        headers={"Content-Type": "application/json", "User-Agent": "mosaicearth-cli/2.1"},
        method="POST",
    )
    with urllib.request.urlopen(req, timeout=30) as r:
        return json.loads(r.read().decode("utf-8"))

def main():
    parser = argparse.ArgumentParser(description="MosaicEarth Hybrid Local + Cloud CLI")
    parser.add_argument("--url", default=DEFAULT_URL, help="MosaicEarth Cloud URL")
    parser.add_argument("--local-odm", default=DEFAULT_LOCAL_ODM, help="Local NodeODM URL (0 EUR processing)")
    parser.add_argument("--email", default="", help="MosaicEarth account email for cloud sync / cloud GPU")
    parser.add_argument("--password", default="", help="MosaicEarth account password")
    parser.add_argument("--project", default="CLI Geospatial Project", help="Target Project in MyEarth")
    parser.add_argument("--survey", default="01 CLI Survey", help="Target Survey in MyEarth")
    parser.add_argument("--task", default="CLI Import Task", help="Target Task in MyEarth")
    parser.add_argument("--lat", type=float, default=41.9794, help="WGS84 Latitude")
    parser.add_argument("--lon", type=float, default=2.8214, help="WGS84 Longitude")
    parser.add_argument("files", nargs="*", help="Geospatial files to ingest (.tif, .laz, .obj, .glb, .ply)")
    args = parser.parse_args()

    if args.email and args.password:
        fname = os.path.basename(args.files[0]) if args.files else "cli_asset.tif"
        ext = os.path.splitext(fname)[1].lstrip(".").upper() or "TIF"
        res = api_post(f"{args.url.rstrip('/')}/api/v2/connectors/sync", {
            "email": args.email,
            "password": args.password,
            "connector": "mosaicearth-cli",
            "project_name": args.project,
            "survey_name": args.survey,
            "task_name": args.task,
            "asset_title": fname,
            "source_format": ext,
            "latitude": args.lat,
            "longitude": args.lon,
        })
        print(json.dumps(res, indent=2))
    else:
        print(json.dumps({
            "ok": True,
            "mode": "local_workstation",
            "local_nodeodm": args.local_odm,
            "cloud_endpoint": args.url,
            "files_queued": args.files,
            "hint": "Pass --email and --password to sync directly into your MyEarth cloud hierarchy."
        }, indent=2))

if __name__ == "__main__":
    main()
