#!/usr/bin/env python3
"""Ativa o greeter Celita sem descartar outras opções do LightDM."""

from pathlib import Path
import re
import shutil


CONFIG = Path("/etc/lightdm/lightdm.conf")
STATE_DIR = Path("/var/lib/celita-login")
BACKUP = STATE_DIR / "lightdm.conf.before-celita"
SETTINGS = {
    "greeter-session": "celita-greeter",
    "greeter-hide-users": "false",
    "user-session": "xfce",
}
SECTION = re.compile(r"^\s*\[\s*([^]]+)\s*]\s*$")
KEY = re.compile(
    r"^\s*#?\s*(greeter-session|greeter-hide-users|user-session)\s*=.*$",
    re.IGNORECASE,
)


def setting_lines(missing):
    return [f"{name}={SETTINGS[name]}\n" for name in SETTINGS if name in missing]


def update_config(text):
    lines = text.splitlines(keepends=True)
    result = []
    in_seat = False
    in_wildcard = False
    wildcard_seen = False
    wildcard_found = set()

    def finish_wildcard():
        if in_wildcard:
            missing = set(SETTINGS) - wildcard_found
            result.extend(setting_lines(missing))

    for raw_line in lines:
        line = raw_line if raw_line.endswith(("\n", "\r")) else raw_line + "\n"
        section = SECTION.match(line)
        if section:
            finish_wildcard()
            section_name = section.group(1).strip().lower()
            in_seat = section_name.startswith("seat:")
            in_wildcard = section_name == "seat:*"
            if in_wildcard:
                wildcard_seen = True
                wildcard_found = set()
            result.append(line)
            continue

        match = KEY.match(line) if in_seat else None
        if match:
            name = match.group(1).lower()
            result.append(f"{name}={SETTINGS[name]}\n")
            if in_wildcard:
                wildcard_found.add(name)
        else:
            result.append(line)

    finish_wildcard()
    if not wildcard_seen:
        if result and result[-1].strip():
            result.append("\n")
        result.append("[Seat:*]\n")
        result.extend(setting_lines(set(SETTINGS)))
    return "".join(result)


def main():
    STATE_DIR.mkdir(parents=True, exist_ok=True)
    if CONFIG.exists():
        original = CONFIG.read_text(encoding="utf-8", errors="replace")
        if not BACKUP.exists():
            shutil.copy2(CONFIG, BACKUP)
    else:
        CONFIG.parent.mkdir(parents=True, exist_ok=True)
        original = ""

    updated = update_config(original)
    if updated == original:
        return
    temporary = CONFIG.with_name(CONFIG.name + ".celita-new")
    temporary.write_text(updated, encoding="utf-8")
    temporary.chmod(0o644)
    temporary.replace(CONFIG)


if __name__ == "__main__":
    main()
