"""Usage: python csv_to_sdf.py compounds.csv [compounds.sdf] [sdf-export-report.csv]"""
import csv
import sys
from pathlib import Path
import chematic

source = Path(sys.argv[1])
sdf_path = Path(sys.argv[2] if len(sys.argv) > 2 else "compounds.sdf")
report_path = Path(sys.argv[3] if len(sys.argv) > 3 else "sdf-export-report.csv")
if len({source.resolve(), sdf_path.resolve(), report_path.resolve()}) != 3:
    raise SystemExit("Input, SDF, and report must have different filenames.")

fields = ["source_row", "source_id", "name", "smiles", "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 chematic.SDWriter(str(sdf_path)) as sdf, \
            report_path.open("w", newline="", encoding="utf-8") as dst:
        report = csv.DictWriter(dst, fieldnames=fields)
        report.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"],
                      "status": "", "error": "",
                      "engine_version": chematic.__version__}
            try:
                smiles = row["smiles"].strip()
                if not smiles:
                    raise ValueError("Empty SMILES")
                mol = chematic.from_smiles(smiles)
            except ValueError as error:
                record.update(status="review", error=str(error))
            else:
                mol.SetProp("_Name", row["source_id"] or f"row_{source_row}")
                mol.SetProp("compound_id", row["source_id"])
                mol.SetProp("compound_name", row.get("name", ""))
                mol.SetProp("source_smiles", row["smiles"])
                mol.SetProp("source_row", str(source_row))
                mol.SetProp("engine_version", chematic.__version__)
                sdf.write(mol)
                record["status"] = "written"
            report.writerow(record)
print(sdf_path, report_path)
