# OHLC.py
import os
import re
import csv

# ================= CONFIGURATION =================
sym = "SPX"

# Folder where this script (OHLC.py) lives
base_dir = os.path.dirname(os.path.abspath(__file__))

# Input/output files in the same folder as this script
infile = os.path.join(base_dir, "OHLC.csv")           # C:\OHLC_DATA\OHLC.csv
outfile = os.path.join(base_dir, f"{sym}OHLC.csv")    # C:\OHLC_DATA\SPXOHLC.csv
# =================================================


def extract_datetime(line: str) -> str | None:
    """
    From a line containing 'Buy to Open;1.0;', extract:
      original: '6/12/26 9:31 AM'
      result:   '6/12/26 9:31:00 AM'
    Returns None if it cannot find a suitable match.
    """
    # Pattern like: 6/12/26 9:31 AM  or  8/13/2019 5:20 PM
    datetime_pattern = r'(\d{1,2}/\d{1,2}/\d{2,4}\s+\d{1,2}:\d{2}\s+(AM|PM))'
    m = re.search(datetime_pattern, line)
    if not m:
        return None

    dt = m.group(1)  # e.g. '6/12/26 9:31 AM'

    # Split into "date time" and "AM/PM"
    parts = dt.rsplit(" ", 1)
    if len(parts) != 2:
        return None

    date_time, ampm = parts  # '6/12/26 9:31', 'AM'
    return f"{date_time}:00 {ampm}"


def extract_ohlc(line: str) -> list[str] | None:
    """
    From a line, extract 'OHLC|...|...|...|...)' and return clean numeric values as:
      ['7403.98', '7408.86', '7403.4', '7406.96']
    Returns None if pattern is not found.
    """
    # Capture everything between 'OHLC|' and ');'
    m = re.search(r'OHLC\|([^)]*?)\);', line)
    if not m:
        return None

    raw = m.group(1)  # e.g. '7,403.98|7,408.86|7,403.4|7,406.96'

    # Remove commas from numbers and split on '|'
    cleaned = raw.replace(",", "")
    parts = cleaned.split("|")

    if len(parts) != 4:
        # Unexpected format – return None to skip line
        return None

    # Return as list of strings
    return parts


def process_file(in_path: str, out_path: str) -> None:
    # Ensure output directory exists, but only if there is a directory part
    dir_name = os.path.dirname(out_path)
    if dir_name:
        os.makedirs(dir_name, exist_ok=True)

    with open(in_path, "r", encoding="utf-8", errors="ignore") as fin, \
         open(out_path, "w", encoding="utf-8", newline="") as fout:

        writer = csv.writer(fout, quoting=csv.QUOTE_ALL)

        # Header line in final-new-plan format
        writer.writerow(["Date Time", "Open", "High", "Low", "Close"])

        for line in fin:
            # Only process lines with 'Buy to Open;1.0;'
            if ";Buy to Open;1.0;" not in line:
                continue

            dt = extract_datetime(line)
            ohlc = extract_ohlc(line)

            if dt is None or ohlc is None:
                # Skip lines where we can't cleanly extract both
                continue

            # dt = '6/12/26 9:31:00 AM'
            # ohlc = ['7403.98', '7408.86', '7403.4', '7406.96']
            writer.writerow([dt, *ohlc])


if __name__ == "__main__":
    process_file(infile, outfile)
    print(f"Finished. Output written to: {outfile}")
