#!/usr/bin/env python3
"""Apply the controlled MySQL compatibility baseline to an existing my.cnf."""

import argparse
import re
import shutil
from pathlib import Path


KEY_RE = re.compile(r"^\s*([A-Za-z0-9_-]+)\s*=")


def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument("--config", type=Path, required=True)
    parser.add_argument("--snippet", type=Path, required=True)
    parser.add_argument("--backup", type=Path, required=True)
    args = parser.parse_args()

    original = args.config.read_text(encoding="utf-8")
    snippet_lines = [
        line
        for line in args.snippet.read_text(encoding="utf-8").splitlines()
        if line and not line.lstrip().startswith(("#", "["))
    ]
    settings = {}
    for line in snippet_lines:
        match = KEY_RE.match(line)
        if not match:
            raise ValueError(f"invalid MySQL setting: {line}")
        settings[match.group(1).lower().replace("_", "-")] = line

    lines = original.splitlines()
    output = []
    in_mysqld = False
    saw_mysqld = False
    applied = set()
    for line in lines:
        stripped = line.strip()
        if stripped.startswith("[") and stripped.endswith("]"):
            if in_mysqld:
                for key, setting in settings.items():
                    if key not in applied:
                        output.append(setting)
                        applied.add(key)
            in_mysqld = stripped.lower() == "[mysqld]"
            saw_mysqld = saw_mysqld or in_mysqld
            output.append(line)
            continue
        match = KEY_RE.match(line)
        normalized = match.group(1).lower().replace("_", "-") if match else ""
        if in_mysqld and normalized in settings:
            if normalized not in applied:
                output.append(settings[normalized])
                applied.add(normalized)
            continue
        output.append(line)

    if not saw_mysqld:
        output.extend(["", "[mysqld]"])
    if in_mysqld or not saw_mysqld:
        for key, setting in settings.items():
            if key not in applied:
                output.append(setting)

    args.backup.parent.mkdir(parents=True, exist_ok=True)
    shutil.copy2(args.config, args.backup)
    args.config.write_text("\n".join(output) + "\n", encoding="utf-8")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
