import os
import json
from datetime import datetime
from PIL import Image, ExifTags

# Configuration
IMAGE_DIR = "./"  # Local path to your folder with JPG files
BASE_URL = "https://ns11042k.web.sigma2.no/panoramas/"

def parse_dms_to_dd(dms, ref):
    """Converts EXIF Degrees/Minutes/Seconds to Decimal Degrees."""
    degrees = float(dms[0])
    minutes = float(dms[1])
    seconds = float(dms[2])
    
    dd = degrees + (minutes / 60.0) + (seconds / 3600.0)
    if ref in ['S', 'W']:
        dd = -dd
    return round(dd, 6)

def extract_metadata(image_path):
    filename = os.path.basename(image_path)
    lat, lng = None, None
    date_str = "Unknown"
    sensor_str = "360 Camera"
    
    try:
        img = Image.open(image_path)
        exif_raw = img._getexif()
        
        if exif_raw:
            exif = {ExifTags.TAGS.get(k, k): v for k, v in exif_raw.items()}
            
            # Extract Date
            if "DateTimeOriginal" in exif:
                try:
                    dt = datetime.strptime(exif["DateTimeOriginal"], "%Y:%m:%d %H:%M:%S")
                    date_str = dt.strftime("%Y-%m-%d")
                except ValueError:
                    pass
            
            # Extract Camera / Sensor Model
            make = exif.get("Make", "").strip()
            model = exif.get("Model", "").strip()
            if make or model:
                sensor_str = f"{make} {model}".strip()

            # Extract GPS Coordinates
            gps_info = exif.get("GPSInfo")
            if gps_info:
                gps_tags = {ExifTags.GPSTAGS.get(k, k): v for k, v in gps_info.items()}
                
                lat_dms = gps_tags.get("GPSLatitude")
                lat_ref = gps_tags.get("GPSLatitudeRef")
                lng_dms = gps_tags.get("GPSLongitude")
                lng_ref = gps_tags.get("GPSLongitudeRef")
                
                if lat_dms and lat_ref and lng_dms and lng_ref:
                    lat = parse_dms_to_dd(lat_dms, lat_ref)
                    lng = parse_dms_to_dd(lng_dms, lng_ref)

    except Exception as err:
        print(f"Warning: Failed to parse EXIF for {filename} ({err})")

    # Clean filename into a human-readable title
    clean_title = os.path.splitext(filename)[0].replace("_", " ").replace("-", " ").title()
    clean_id = os.path.splitext(filename)[0].lower().replace(" ", "_")

    return {
        "id": clean_id,
        "title": clean_title,
        "site": "Field Site",
        "date": date_str,
        "sensor": sensor_str,
        "imageUrl": f"{BASE_URL}{filename}",
        "lat": lat,
        "lng": lng
    }

def main():
    if not os.path.exists(IMAGE_DIR):
        print(f"Directory '{IMAGE_DIR}' not found. Please create it and add .jpg images.")
        return

    catalog = []
    valid_extensions = ('.jpg', '.jpeg', '.JPG', '.JPEG')

    for fname in sorted(os.listdir(IMAGE_DIR)):
        if fname.endswith(valid_extensions):
            full_path = os.path.join(IMAGE_DIR, fname)
            catalog.append(extract_metadata(full_path))

    js_output = f"const panoCatalog = {json.dumps(catalog, indent=4)};"
    
    print("\n--- COPY AND PASTE THIS INTO PanoViewer.html ---\n")
    print(js_output)
    
    # Save directly to file
    with open("panoCatalog.js", "w", encoding="utf-8") as f:
        f.write(js_output)
    print("\n[✓] Saved to panoCatalog.js")

if __name__ == "__main__":
    main()