#!/usr/bin/env python3
"""
Script to set sensitivity in httpd_config.xml based on value from ls.txt or CLI argument.
"""

import re
import subprocess
import sys

HTTPD_CONFIG = "/usr/local/lsws/conf/httpd_config.xml"
LS_TXT = "/home/SRVNAME/public_html/ls.txt"


def get_value():
    """Get value from CLI argument or from ls.txt."""
    if len(sys.argv) >= 2 and sys.argv[1] in ("1", "2", "3"):
        return sys.argv[1]
    try:
        with open(LS_TXT, "r") as f:
            return f.read().strip()
    except OSError as e:
        print(f"Error reading {LS_TXT}: {e}", file=sys.stderr)
        sys.exit(1)


def update_sensitivity(new_value):
    """Replace <sensitivity>...</sensitivity> line in httpd_config.xml with new value."""
    try:
        with open(HTTPD_CONFIG, "r") as f:
            content = f.read()
    except OSError as e:
        print(f"Error reading {HTTPD_CONFIG}: {e}", file=sys.stderr)
        sys.exit(1)

    # Match <sensitivity>...</sensitivity> (any content between tags), preserve indentation
    pattern = re.compile(r"(\s*)<sensitivity>.*?</sensitivity>", re.DOTALL)
    replacement = r"\g<1><sensitivity>" + str(new_value) + r"</sensitivity>"
    new_content = pattern.sub(replacement, content)

    if new_content == content:
        print("Warning: no <sensitivity> line found in config", file=sys.stderr)

    try:
        with open(HTTPD_CONFIG, "w") as f:
            f.write(new_content)
    except OSError as e:
        print(f"Error writing {HTTPD_CONFIG}: {e}", file=sys.stderr)
        sys.exit(1)

    try:
        result = subprocess.run(
            ["systemctl", "restart", "lsws"],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            universal_newlines=True,
            timeout=120,
        )
    except subprocess.TimeoutExpired:
        print("Error: systemctl restart lsws did not complete within 120 seconds", file=sys.stderr)
        sys.exit(1)
    if result.returncode != 0:
        print(
            "Error restarting LiteSpeed: {}".format(result.stderr or result.stdout or "unknown"),
            file=sys.stderr,
        )
        sys.exit(1)


def write_ls_txt(value):
    """Write value to ls.txt."""
    try:
        with open(LS_TXT, "w") as f:
            f.write(value + "\n")
    except OSError as e:
        print(f"Error writing {LS_TXT}: {e}", file=sys.stderr)
        sys.exit(1)


def main():
    value = get_value()

    if value == "3":
        return

    if value == "1":
        update_sensitivity(100)
        write_ls_txt("3")
        return

    if value == "2":
        update_sensitivity(0)
        write_ls_txt("3")
        return

    print(f"Invalid value: expected 1, 2 or 3 (got: {value!r})", file=sys.stderr)
    sys.exit(1)


if __name__ == "__main__":
    main()
    sys.exit(0)

