"""
Analyse scraped jobs: skill coverage for target roles + hiring volume by job type.
"""
from __future__ import annotations

from collections import Counter
from pathlib import Path

import pandas as pd

ROOT = Path(__file__).resolve().parent
CSV_PATH = ROOT / "jobs.csv"
OUT_TXT = ROOT / "analysis_summary.txt"
CHART_DIR = ROOT / "charts"

# Roles you "like" — edit these keywords (matched against title / job_type)
TARGET_KEYWORDS = ["前端", "數據", "frontend", "data", "分析"]


def load_jobs(path: Path) -> pd.DataFrame:
    df = pd.read_csv(path)
    df["openings"] = pd.to_numeric(df["openings"], errors="coerce").fillna(1).astype(int)
    df["skills_list"] = df["skills"].fillna("").apply(lambda s: [x for x in str(s).split("|") if x])
    return df


def skill_coverage(df: pd.DataFrame, keywords: list[str]):
    mask = df["title"].fillna("").str.contains("|".join(keywords), case=False, regex=True) | df[
        "job_type"
    ].fillna("").str.contains("|".join(keywords), case=False, regex=True)
    subset = df[mask]
    counter: Counter = Counter()
    for skills in subset["skills_list"]:
        counter.update(skills)
    return counter, subset


def hiring_by_type(df: pd.DataFrame) -> pd.Series:
    return df.groupby("job_type")["openings"].sum().sort_values(ascending=False)


def maybe_charts(by_type: pd.Series, skills: Counter) -> None:
    try:
        import matplotlib.pyplot as plt
    except ImportError:
        return
    CHART_DIR.mkdir(exist_ok=True)
    plt.figure(figsize=(7, 4))
    by_type.plot(kind="bar", color="#0b7a6a")
    plt.title("Hiring volume by job type")
    plt.ylabel("Openings")
    plt.tight_layout()
    plt.savefig(CHART_DIR / "hiring_by_type.png", dpi=140)
    plt.close()

    top = skills.most_common(8)
    if top:
        labels, values = zip(*top)
        plt.figure(figsize=(7, 4))
        plt.bar(labels, values, color="#146b5f")
        plt.title("Top skills for target roles")
        plt.xticks(rotation=30, ha="right")
        plt.tight_layout()
        plt.savefig(CHART_DIR / "skills_target.png", dpi=140)
        plt.close()


if __name__ == "__main__":
    if not CSV_PATH.exists():
        raise SystemExit("jobs.csv not found — run scrape_jobs.py first")

    df = load_jobs(CSV_PATH)
    skills, subset = skill_coverage(df, TARGET_KEYWORDS)
    by_type = hiring_by_type(df)
    maybe_charts(by_type, skills)

    lines = [
        f"Total postings: {len(df)}",
        f"Total openings (sum): {int(df['openings'].sum())}",
        f"Target-role matches: {len(subset)} (keywords={TARGET_KEYWORDS})",
        "",
        "Hiring volume by job_type:",
        by_type.to_string(),
        "",
        "Top skills for target roles:",
    ]
    for skill, n in skills.most_common(12):
        lines.append(f"  {skill}: {n}")

    OUT_TXT.write_text("\n".join(lines), encoding="utf-8")
    print("\n".join(lines))
    print(f"\nWrote {OUT_TXT}")
    if CHART_DIR.exists():
        print(f"Charts in {CHART_DIR}")
