import re
from typing import Tuple, Optional

FLAKE_CONFIG_PATH = "/etc/nixos/sp-modules/flake.nix"


class FlakeServiceManager:
    def __enter__(self) -> "FlakeServiceManager":
        self.services = {}

        with open(FLAKE_CONFIG_PATH, "r") as file:
            for line in file:
                service_name, url = self._extract_services(input_string=line)
                if service_name and url:
                    self.services[service_name] = url

        return self

    def _extract_services(
        self, input_string: str
    ) -> Tuple[Optional[str], Optional[str]]:
        pattern = r"inputs\.([\w-]+)\.url\s*=\s*([\S]+);"
        match = re.search(pattern, input_string)

        if match:
            variable_name = match.group(1)
            url = match.group(2)
            return variable_name, url
        else:
            return None, None

    def __exit__(self, exc_type, exc_value, traceback) -> None:
        with open(FLAKE_CONFIG_PATH, "w") as file:
            file.write(
                """
{
  description = "SelfPrivacy NixOS PoC modules/extensions/bundles/packages/etc";\n
"""
            )

            for key, value in self.services.items():
                file.write(
                    f"""
  inputs.{key}.url = {value};
"""
                )

            file.write(
                """
  outputs = _: { };
}
"""
            )