"""Turn a messy sales export into a one-page report."""
import argparse
from pathlib import Path

import matplotlib
matplotlib.use("Agg")            # no window needed; we only save files
import matplotlib.pyplot as plt
import pandas as pd


def load_and_clean(path):
    """Read the export and normalize the columns we group and join on."""
    sales = pd.read_csv(path)
    sales.columns = [c.strip() for c in sales.columns]
    sales["region"] = sales["region"].str.strip().str.lower()
    sales["units"] = sales["units"].fillna(0).astype(int)
    sales["revenue"] = (sales["units"] * sales["unit_price"]).round(2)
    return sales


def summarize(sales, regions):
    """One row per region, joined to its manager and target."""
    by_region = (sales.groupby("region")
                 .agg(orders=("order_id", "count"),
                      units=("units", "sum"),
                      revenue=("revenue", "sum"))
                 .round(2)
                 .reset_index())
    report = by_region.merge(regions, on="region", how="left")
    report["hit_target"] = report["revenue"] >= report["target"]
    return report


def chart(report, path):
    fig, ax = plt.subplots(figsize=(6, 3.5))
    ax.bar(report["region"], report["revenue"], color="#2b7cd3", label="revenue")
    ax.scatter(report["region"], report["target"], color="#d34b2b", zorder=3,
               label="target")
    ax.set_title("Revenue by region")
    ax.set_xlabel("region")
    ax.set_ylabel("revenue ($)")
    ax.legend()
    fig.tight_layout()
    fig.savefig(path, dpi=110)
    plt.close(fig)


def conclusion(report):
    missed = ", ".join(report.loc[~report["hit_target"], "region"]) or "none"
    return (f"Total revenue: ${report['revenue'].sum():,.2f} across "
            f"{int(report['orders'].sum())} orders.\n"
            f"Best region: {report.loc[report['revenue'].idxmax(), 'region']}.\n"
            f"{int(report['hit_target'].sum())} of {len(report)} met target; "
            f"{missed} did not.\n"
            "Caveat: missing unit counts were treated as 0.")


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("sales", nargs="?", default="sales.csv")
    parser.add_argument("--regions", default="regions.csv")
    parser.add_argument("--out", default="output")
    args = parser.parse_args()

    out = Path(args.out)
    out.mkdir(exist_ok=True)

    report = summarize(load_and_clean(args.sales), pd.read_csv(args.regions))
    report.to_csv(out / "summary.csv", index=False)
    chart(report, out / "revenue.png")
    (out / "conclusion.txt").write_text(conclusion(report), encoding="utf-8")

    print(report.to_string(index=False))
    print()
    print(conclusion(report))


if __name__ == "__main__":
    main()
