#!/usr/bin/env python3
"""Store Kakao memo credentials in macOS Keychain for Codex automations."""

from __future__ import annotations

import argparse
import getpass
import subprocess


SERVICE = "codex-us-equity-kakao"
REQUIRED = ["KAKAO_REST_API_KEY", "KAKAO_REFRESH_TOKEN"]
OPTIONAL = ["KAKAO_CLIENT_SECRET", "KAKAO_LINK_URL"]


def run_security(args: list[str]) -> subprocess.CompletedProcess[str]:
    return subprocess.run(["security", *args], capture_output=True, text=True, check=False)


def set_secret(account: str, value: str) -> None:
    run_security(["delete-generic-password", "-s", SERVICE, "-a", account])
    result = run_security(
        [
            "add-generic-password",
            "-U",
            "-s",
            SERVICE,
            "-a",
            account,
            "-w",
            value,
        ]
    )
    if result.returncode != 0:
        raise SystemExit(result.stderr.strip() or f"Failed to store {account}")


def has_secret(account: str) -> bool:
    result = run_security(["find-generic-password", "-s", SERVICE, "-a", account, "-w"])
    return result.returncode == 0 and bool(result.stdout.strip())


def command_set() -> None:
    for name in REQUIRED:
        value = getpass.getpass(f"{name}: ").strip()
        if not value:
            raise SystemExit(f"{name} is required.")
        set_secret(name, value)

    for name in OPTIONAL:
        value = getpass.getpass(f"{name} (optional, Enter to skip): ").strip()
        if value:
            set_secret(name, value)

    print("Kakao credentials stored in macOS Keychain.")


def command_status() -> None:
    for name in [*REQUIRED, *OPTIONAL, "KAKAO_ACCESS_TOKEN"]:
        print(f"{name}: {'set' if has_secret(name) else 'missing'}")


def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument("command", choices=["set", "status"])
    args = parser.parse_args()
    if args.command == "set":
        command_set()
    elif args.command == "status":
        command_status()
    return 0


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