#!/usr/bin/env python3
import argparse, csv, pathlib
from datetime import datetime

DT_FMT_IN = "%m/%d/%Y %H:%M"


def parse_mileiq_rows(path: pathlib.Path):
    lines = path.read_text(errors="ignore").splitlines()
    header_idx = None
    for i, line in enumerate(lines):
        if "START_DATE*" in line and "END_DATE*" in line and "CATEGORY*" in line:
            header_idx = i
            break
    if header_idx is None:
        raise SystemExit("Could not find DETAILED LOG header row.")

    rdr = csv.DictReader(lines[header_idx:])
    rows = []
    for r in rdr:
        sd = (r.get("START_DATE*") or "").strip()
        ed = (r.get("END_DATE*") or "").strip()
        cat = (r.get("CATEGORY*") or "").strip()
        if not sd or not ed or sd.lower().startswith("totals"):
            continue
        if cat != "Business":
            continue
        try:
            sdt = datetime.strptime(sd, DT_FMT_IN)
            edt = datetime.strptime(ed, DT_FMT_IN)
        except ValueError:
            continue
        row = {
            "start_dt": sdt,
            "end_dt": edt,
            "start": (r.get("START*") or "").strip(),
            "stop": (r.get("STOP*") or "").strip(),
            "purpose": (r.get("PURPOSE") or "").strip(),
        }
        rows.append(row)

    rows.sort(key=lambda x: x["start_dt"])
    return rows


def build_shifts(rows, user):
    ready, review = [], []
    for i in range(len(rows) - 1):
        cur = rows[i]
        nxt = rows[i + 1]

        start_dt = cur["end_dt"]
        end_dt = nxt["start_dt"]

        if end_dt <= start_dt:
            review.append({
                "Reason": "non_positive_interval",
                "Job": cur["stop"],
                "Users": user,
                "Start Time": start_dt.strftime("%H:%M"),
                "Start Date": start_dt.strftime("%m/%d/%Y"),
                "End Time": end_dt.strftime("%H:%M"),
                "End Date": end_dt.strftime("%m/%d/%Y"),
                "From Purpose": cur["purpose"],
                "To Purpose": nxt["purpose"],
            })
            continue

        out = {
            "Job": cur["stop"],
            "Users": user,
            "Start Time": start_dt.strftime("%H:%M"),
            "Start Date": start_dt.strftime("%m/%d/%Y"),
            "End Time": end_dt.strftime("%H:%M"),
            "End Date": end_dt.strftime("%m/%d/%Y"),
        }

        if not out["Job"]:
            review.append({"Reason": "missing_job", **out, "From Purpose": cur["purpose"], "To Purpose": nxt["purpose"]})
        else:
            ready.append(out)

    return ready, review


def write_csv(path: pathlib.Path, rows, headers):
    path.parent.mkdir(parents=True, exist_ok=True)
    with path.open("w", newline="") as f:
        w = csv.DictWriter(f, fieldnames=headers)
        w.writeheader()
        w.writerows(rows)


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--input", required=True)
    ap.add_argument("--output-dir", required=True)
    ap.add_argument("--default-user", required=True)
    args = ap.parse_args()

    in_path = pathlib.Path(args.input)
    out_dir = pathlib.Path(args.output_dir)

    rows = parse_mileiq_rows(in_path)
    ready, review = build_shifts(rows, args.default_user)

    ready_csv = out_dir / "buildertrend_shifts_ready.csv"
    review_csv = out_dir / "buildertrend_shifts_review.csv"
    summary_md = out_dir / "buildertrend_shift_summary.md"

    ready_headers = ["Job", "Users", "Start Time", "Start Date", "End Time", "End Date"]
    review_headers = ["Reason", "Job", "Users", "Start Time", "Start Date", "End Time", "End Date", "From Purpose", "To Purpose"]

    write_csv(ready_csv, ready, ready_headers)
    write_csv(review_csv, review, review_headers)

    total = len(rows)
    summary_md.parent.mkdir(parents=True, exist_ok=True)
    summary_md.write_text(
        "\n".join([
            "# Buildertrend Shift Dry Run Summary",
            "",
            f"- Input file: `{in_path}`",
            f"- Business drive rows parsed: **{total}**",
            f"- Shift rows generated (ready): **{len(ready)}**",
            f"- Shift rows flagged for review: **{len(review)}**",
            "",
            "## Rule used",
            "- One shift per consecutive Business-drive pair.",
            "- Shift Start = prior drive END_DATE*.",
            "- Shift End = next drive START_DATE*.",
            "- Job = prior drive STOP*.",
            "",
            "## Output files",
            f"- `{ready_csv}`",
            f"- `{review_csv}`",
            f"- `{summary_md}`",
            "",
        ])
    )

    print(f"ready={len(ready)} review={len(review)} business_rows={total}")
    print(str(ready_csv))
    print(str(review_csv))
    print(str(summary_md))


if __name__ == "__main__":
    main()
