"""Usage: python formula_csv.py compounds.csv [formula-report.csv]"""
import csv
import sys
from pathlib import Path
import chematic

source = Path(sys.argv[1])
output = Path(sys.argv[2] if len(sys.argv) > 2 else "formula-report.csv")
if source.resolve() == output.resolve():
    raise SystemExit("Choose an output filename different from the input.")

fields = ["source_row", "source_id", "name", "smiles", "formula",
          "mw_g_mol", "status", "error", "engine_version"]
with source.open(newline="", encoding="utf-8-sig") as src:
    reader = csv.DictReader(src)
    if not {"source_id", "smiles"}.issubset(reader.fieldnames or []):
        raise SystemExit("The CSV needs source_id and smiles columns.")
    with output.open("w", newline="", encoding="utf-8") as dst:
        writer = csv.DictWriter(dst, fieldnames=fields)
        writer.writeheader()
        for source_row, row in enumerate(reader, start=2):
            record = {"source_row": source_row, "source_id": row["source_id"],
                      "name": row.get("name", ""), "smiles": row["smiles"],
                      "formula": "", "mw_g_mol": "", "status": "",
                      "error": "", "engine_version": chematic.__version__}
            try:
                smiles = row["smiles"].strip()
                if not smiles:
                    raise ValueError("Empty SMILES")
                mol = chematic.from_smiles(smiles)
                record.update(formula=mol.formula, mw_g_mol=f"{mol.mw:.2f}",
                              status="ok")
            except ValueError as error:
                record.update(status="review", error=str(error))
            writer.writerow(record)
print(output)
