#!/usr/bin/env python3
"""
AI-Governance-Jobs.com — Job Tracker & Daily Digest (official example)
---------------------------------------------------------------------
Pulls live governance, risk, compliance, and AI-governance jobs from the
GRC Careers syndication API, records new ones in a Google Sheet, and emails
you an HTML digest of anything new since the last run.

Get a free API key: email contact@ai-governance-jobs.com  (terms: /syndicate/)
Attribution required: display "Jobs via AI-Governance-Jobs.com" with a link back.

Install:
    pip install requests google-auth-oauthlib google-api-python-client
"""
import os.path
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

import requests
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

# ==================== CONFIGURATION ====================
# 1. AI-Governance-Jobs API (request a free key at /syndicate/)
API_URL = "https://www.ai-governance-jobs.com/api/feed"
API_KEY = "YOUR_AI_GOVERNANCE_JOBS_API_KEY"

# 2. Google Sheets (create a blank sheet; copy its ID from the browser URL)
SPREADSHEET_ID = "YOUR_GOOGLE_SPREADSHEET_ID"
SHEET_RANGE = "Sheet1!A:E"          # columns: URL, Title, Company, Location, Salary
SCOPES = ["https://www.googleapis.com/auth/spreadsheets"]

# 3. Gmail SMTP (use a 16-character Gmail App Password, NOT your login password)
SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 587
SENDER_EMAIL = "your_gmail@gmail.com"
SENDER_PASSWORD = "your_16_character_app_password"
RECEIVER_EMAIL = "target_destination_email@domain.com"
# ======================================================


def location_of(job):
    parts = [job.get("city"), job.get("state_region")]
    loc = ", ".join(p for p in parts if p)
    if not loc:
        loc = "Remote" if job.get("workplace_setting") == "remote" else "United States"
    if job.get("workplace_setting") == "remote" and "Remote" not in loc:
        loc += " (Remote)"
    return loc


def salary_of(job):
    lo, hi = job.get("salary_min"), job.get("salary_max")
    if lo and hi:
        return f"${int(lo):,} - ${int(hi):,}"
    if lo or hi:
        return f"${int(lo or hi):,}"
    return "N/A"


def get_sheets_service():
    creds = None
    if os.path.exists("token.json"):
        creds = Credentials.from_authorized_user_file("token.json", SCOPES)
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file("credentials.json", SCOPES)
            creds = flow.run_local_server(port=0)
        with open("token.json", "w") as token:
            token.write(creds.to_json())
    return build("sheets", "v4", credentials=creds)


def existing_urls(service):
    try:
        result = service.spreadsheets().values().get(
            spreadsheetId=SPREADSHEET_ID, range=SHEET_RANGE).execute()
        return {row[0] for row in result.get("values", []) if row}
    except HttpError as err:
        print(f"Google Sheets error: {err}")
        return set()


def append_jobs(service, jobs):
    values = [[j["url"], j.get("job_title", ""), j.get("organization_name", ""),
               location_of(j), salary_of(j)] for j in jobs]
    service.spreadsheets().values().append(
        spreadsheetId=SPREADSHEET_ID, range=SHEET_RANGE,
        valueInputOption="RAW", body={"values": values}).execute()
    print(f"Appended {len(jobs)} new job(s) to the sheet.")


def send_digest(jobs):
    rows = ""
    for j in jobs:
        rows += f"""
        <tr>
          <td style="padding:12px;border-bottom:1px solid #ddd">
            <strong style="color:#0a2540">{j.get('job_title','')}</strong><br>
            <small style="color:#555">{j.get('organization_name','')} &middot; {location_of(j)}</small>
          </td>
          <td style="padding:12px;border-bottom:1px solid #ddd;color:#137a3d">{salary_of(j)}</td>
          <td style="padding:12px;border-bottom:1px solid #ddd">
            <a href="{j['url']}" style="background:#c9a227;color:#0a2540;padding:6px 12px;text-decoration:none;border-radius:4px;font-size:12px;font-weight:700">View</a>
          </td>
        </tr>"""
    html = f"""<html><body style="font-family:Arial,sans-serif;background:#f4f5f7;padding:20px">
      <div style="max-width:640px;background:#fff;margin:0 auto;border-radius:8px;padding:22px">
        <h2 style="color:#0a2540;border-bottom:2px solid #e2e8f0;padding-bottom:10px">Daily AI Governance Postings</h2>
        <p>{len(jobs)} new governance, risk, and compliance role(s) since your last run:</p>
        <table style="width:100%;border-collapse:collapse;margin-top:12px">{rows}</table>
        <p style="font-size:11px;color:#94a3b8;margin-top:26px;text-align:center">
          Jobs via <a href="https://www.ai-governance-jobs.com/">AI-Governance-Jobs.com</a>
        </p>
      </div></body></html>"""
    msg = MIMEMultipart("alternative")
    msg["Subject"] = f"AI Governance Digest: {len(jobs)} new role(s)"
    msg["From"], msg["To"] = SENDER_EMAIL, RECEIVER_EMAIL
    msg.attach(MIMEText(html, "html"))
    with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
        server.starttls()
        server.login(SENDER_EMAIL, SENDER_PASSWORD)
        server.sendmail(SENDER_EMAIL, RECEIVER_EMAIL, msg.as_string())
    print("Digest email sent.")


def main():
    # 1. Fetch live jobs. /api/feed returns {"count":N,"jobs":[...]} — read the "jobs" array.
    try:
        r = requests.get(API_URL, headers={"x-api-key": API_KEY, "Accept": "application/json"}, timeout=15)
        r.raise_for_status()
        jobs = r.json().get("jobs", [])
    except Exception as e:
        print(f"API error: {e}")
        return

    # 2. Dedupe against the sheet, keep only new URLs
    service = get_sheets_service()
    seen = existing_urls(service)
    new_jobs = [j for j in jobs if j.get("url") not in seen]

    # 3. Record + notify
    if new_jobs:
        append_jobs(service, new_jobs)
        send_digest(new_jobs)
    else:
        print("No new postings since the last run.")


if __name__ == "__main__":
    main()
