"""
Selenium scraper for the CareerAck lab sample job board.
Practice locally first. Only point BASE_URL at live sites if allowed by their Terms.
"""
from __future__ import annotations

import csv
import time
from pathlib import Path

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

# Local sample (start http.server in sample_jobs/ on port 8765)
BASE_URL = "http://127.0.0.1:8765/index.html"
OUT_CSV = Path(__file__).resolve().parent / "jobs.csv"
HEADLESS = True


def build_driver() -> webdriver.Chrome:
    opts = Options()
    if HEADLESS:
        opts.add_argument("--headless=new")
    opts.add_argument("--window-size=1280,900")
    opts.add_argument("--disable-gpu")
    # Selenium 4.6+ can manage drivers automatically
    return webdriver.Chrome(options=opts)


def scrape(url: str) -> list[dict]:
    driver = build_driver()
    rows: list[dict] = []
    try:
        driver.get(url)
        wait = WebDriverWait(driver, 15)
        cards = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".job-card")))
        for card in cards:
            title = card.find_element(By.CSS_SELECTOR, ".title").text.strip()
            company = card.find_element(By.CSS_SELECTOR, ".company").text.strip()
            location = card.find_element(By.CSS_SELECTOR, ".location").text.strip()
            job_type = card.find_element(By.CSS_SELECTOR, ".job-type").text.strip()
            openings_text = card.find_element(By.CSS_SELECTOR, ".openings").text.strip()
            try:
                openings = int(openings_text)
            except ValueError:
                openings = 1
            skills = [s.text.strip() for s in card.find_elements(By.CSS_SELECTOR, ".skills span") if s.text.strip()]
            desc = card.find_element(By.CSS_SELECTOR, ".desc").text.strip()
            detail = ""
            links = card.find_elements(By.CSS_SELECTOR, "a.detail")
            if links:
                detail = links[0].get_attribute("href") or ""
            rows.append(
                {
                    "title": title,
                    "company": company,
                    "location": location,
                    "job_type": job_type,
                    "openings": openings,
                    "skills": "|".join(skills),
                    "description": desc,
                    "url": detail or url,
                }
            )
            time.sleep(0.2)  # polite pacing even on local pages
    finally:
        driver.quit()
    return rows


def save_csv(rows: list[dict], path: Path) -> None:
    fields = ["title", "company", "location", "job_type", "openings", "skills", "description", "url"]
    with path.open("w", newline="", encoding="utf-8-sig") as f:
        w = csv.DictWriter(f, fieldnames=fields)
        w.writeheader()
        w.writerows(rows)


if __name__ == "__main__":
    data = scrape(BASE_URL)
    save_csv(data, OUT_CSV)
    print(f"Scraped {len(data)} jobs → {OUT_CSV}")
