#!/bin/bash
set -euo pipefail

# --- Resolve the project dir to *this* script's folder ---
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
VENV_DIR="$SCRIPT_DIR/venv"
PYTHON_SCRIPT="export_w1hd9_raw.py"
OUTPUT_DIR="$SCRIPT_DIR"
CALLSIGN="W1HD-9"

# Time window (UTC)
START_TIME=$(date -u -d "8 hours ago" +"%Y-%m-%d %H:%M")
END_TIME=$(date -u +"%Y-%m-%d %H:%M")

# Safe filename
START_SAFE="${START_TIME//[: ]/_}"
END_SAFE="${END_TIME//[: ]/_}"
OUTPUT_FILE="w1hd9_raw_${START_SAFE}_${END_SAFE}.csv"

# --- System packages ---
sudo apt-get update
sudo apt-get install -y google-chrome-stable python3-venv python3-full

# --- Ensure project ownership (optional) ---
# sudo chown -R bbl:bbl "$SCRIPT_DIR"

# --- Work as user bbl for venv + run ---
sudo -u bbl -H bash -lc "
  set -euo pipefail

  # Check creds early
  if ! grep -q 'APRS_USERNAME' ~/.bashrc >/dev/null 2>&1; then
    echo 'WARNING: APRS_USERNAME not found in ~bbl/.bashrc' >&2
  fi
  if ! grep -q 'APRS_PASSWORD' ~/.bashrc >/dev/null 2>&1; then
    echo 'WARNING: APRS_PASSWORD not found in ~bbl/.bashrc' >&2
  fi

  # Create venv
  if [ ! -d \"$VENV_DIR\" ]; then
    echo 'Creating virtual environment...'
    python3 -m venv \"$VENV_DIR\"
  fi
  source \"$VENV_DIR/bin/activate\"

  python -m pip install --upgrade pip
  pip install --upgrade selenium webdriver-manager

  # Write Python driver
  cat > \"$SCRIPT_DIR/$PYTHON_SCRIPT\" << 'PYEOF'
#!/usr/bin/env python3
import os, time, glob, sys, json, traceback
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.chrome.options import Options as ChromeOptions

USERNAME = os.environ.get('APRS_USERNAME')
PASSWORD = os.environ.get('APRS_PASSWORD')
OUTPUT_DIR = os.environ.get('OUTPUT_DIR', '.')
CALLSIGN   = os.environ.get('CALLSIGN', 'W1HD-9')
START_TIME = os.environ.get('START_TIME')
END_TIME   = os.environ.get('END_TIME')
OUTPUT_FILE= os.environ.get('OUTPUT_FILE', 'export.csv')
DEBUG_DIR  = os.path.join(OUTPUT_DIR, 'debug')

os.makedirs(OUTPUT_DIR, exist_ok=True)
os.makedirs(DEBUG_DIR, exist_ok=True)

def snap(tag, driver):
    """Save screenshot and HTML for debugging."""
    try:
        png = os.path.join(DEBUG_DIR, f'{int(time.time())}_{tag}.png')
        html = os.path.join(DEBUG_DIR, f'{int(time.time())}_{tag}.html')
        driver.save_screenshot(png)
        open(html, 'w', encoding='utf-8').write(driver.page_source)
        print('DEBUG wrote', png, 'and', html)
    except Exception as e:
        print('DEBUG snap failed:', e)

def fail(msg):
    print('ERROR:', msg)
    sys.exit(1)

if not USERNAME or not PASSWORD:
    fail('APRS_USERNAME/APRS_PASSWORD not set in environment for user bbl')

# Headless Chrome config
chrome_prefs = {
    'download.default_directory': OUTPUT_DIR,
    'download.prompt_for_download': False,
    'profile.default_content_setting_values.automatic_downloads': 1,
    'safebrowsing.enabled': True,
}
options = ChromeOptions()
options.add_argument('--headless=new')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1280,1200')
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_argument('--user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121 Safari/537.36')
options.add_experimental_option('prefs', chrome_prefs)

driver = None
try:
    service = ChromeService(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service, options=options)
    wait = WebDriverWait(driver, 25)

    # Print versions for logs
    try:
        caps = driver.capabilities
        print('Chrome version:', caps.get('browserVersion'))
        print('Driver version:', caps.get('chrome', {}).get('chromedriverVersion'))
    except Exception:
        pass

    # Allow downloads in headless
    try:
        driver.execute_cdp_cmd('Page.setDownloadBehavior', {
            'behavior': 'allow',
            'downloadPath': OUTPUT_DIR
        })
    except Exception:
        pass

    # 1) Home
    driver.get('https://aprs.fi/')
    snap('home', driver)
    time.sleep(1)

    # 2) Login
    login = wait.until(EC.element_to_be_clickable((By.XPATH, \"//a[contains(., 'Login')]\")))
    login.click()
    time.sleep(1)
    snap('login_page', driver)

    # username/password fields (several possible names)
    user = wait.until(EC.presence_of_element_located((By.XPATH, \"//*[@id='username' or @name='username' or @name='login']\")))
    pw   = wait.until(EC.presence_of_element_located((By.XPATH, \"//*[@id='password' or @name='password']\")))
    user.clear(); user.send_keys(USERNAME)
    time.sleep(0.3)
    pw.clear(); pw.send_keys(PASSWORD); pw.send_keys(Keys.RETURN)
    time.sleep(2)
    snap('after_login', driver)

    # 3) Export page
    driver.get('https://aprs.fi/export/')
    time.sleep(1)
    snap('export_page', driver)

    # Fill fields
    call_el  = wait.until(EC.presence_of_element_located((By.XPATH, \"//*[@name='call' or @id='call' or contains(@placeholder,'callsign')]\")))
    start_el = wait.until(EC.presence_of_element_located((By.XPATH, \"//*[@name='start' or @id='start']\")))
    end_el   = wait.until(EC.presence_of_element_located((By.XPATH, \"//*[@name='end' or @id='end']\")))

    call_el.clear();  call_el.send_keys(CALLSIGN)
    start_el.clear(); start_el.send_keys(START_TIME)
    end_el.clear();   end_el.send_keys(END_TIME)
    snap('filled_form', driver)

    # Prefer CSV if present
    try:
        radios = driver.find_elements(By.XPATH, \"//input[@type='radio' and (contains(@value,'csv') or contains(@id,'csv'))]\")
        if radios:
            radios[0].click()
    except Exception:
        pass

    # Submit
    # Try button first; if absent, try form submit
    try:
        export_btn = wait.until(EC.element_to_be_clickable((By.XPATH, \"//button[contains(.,'Export') or contains(.,'Download') or @type='submit']\")))
        export_btn.click()
    except Exception:
        try:
            form = driver.find_element(By.XPATH, \"//form[.//*[@name='call']]\" )
            form.submit()
        except Exception:
            snap('no_submit', driver)
            fail('Could not locate export/submit control')

    time.sleep(2)
    snap('after_submit', driver)

    # Wait for download to finish
    before = set(glob.glob(os.path.join(OUTPUT_DIR, '*')))
    deadline = time.time() + 40
    downloaded = None
    while time.time() < deadline:
        time.sleep(1)
        after = set(glob.glob(os.path.join(OUTPUT_DIR, '*')))
        new = [f for f in (after - before) if not f.endswith('.crdownload')]
        if new:
            downloaded = sorted(new, key=os.path.getmtime)[-1]
            break

    if not downloaded:
        snap('no_download', driver)
        fail(f'No file appeared in {OUTPUT_DIR}')

    dest = os.path.join(OUTPUT_DIR, OUTPUT_FILE)
    if downloaded != dest:
        try:
            os.replace(downloaded, dest)
        except Exception as e:
            print('Downloaded but rename failed:', e)
            dest = downloaded

    print('Saved', dest)

except Exception as e:
    print('Error during run:', repr(e))
    traceback.print_exc()
    if driver:
        snap('exception', driver)
    sys.exit(1)
finally:
    if driver:
        driver.quit()
PYEOF

  chmod +x \"$SCRIPT_DIR/$PYTHON_SCRIPT\"

  # Run with env
  export OUTPUT_DIR=\"$OUTPUT_DIR\"
  export CALLSIGN=\"$CALLSIGN\"
  export START_TIME=\"$START_TIME\"
  export END_TIME=\"$END_TIME\"
  export OUTPUT_FILE=\"$OUTPUT_FILE\"

  echo \"Running export at \$(date -u) ...\"
  \"$VENV_DIR/bin/python\" \"$SCRIPT_DIR/$PYTHON_SCRIPT\"
"

echo "Done. Check: $OUTPUT_DIR/$OUTPUT_FILE (and $OUTPUT_DIR/debug/ for screenshots & HTML)"
