#!/usr/bin/env python3
import subprocess
import time
import re
import logging
from datetime import datetime

CHECK_INTERVAL = 30

STOP_SCRIPT = "/opt/automine/stopmine.sh"
START_SCRIPT = "/opt/automine/startmine.sh"

CONTAINER_NAME_PATTERN = re.compile(r"^C\.\d+$")

LOG_FILE = "/var/log/check_c_container.log"


def setup_logging():
    logging.basicConfig(
        filename=LOG_FILE,
        level=logging.INFO,
        format="%(asctime)s [%(levelname)s] %(message)s"
    )


def run_command(cmd):
    try:
        result = subprocess.run(
            cmd,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,
            check=False
        )
        return result.returncode, result.stdout.strip(), result.stderr.strip()
    except Exception as e:
        logging.error(f"执行命令失败: {' '.join(cmd)}, 错误: {e}")
        return 1, "", str(e)


def run_script(script_path):
    code, stdout, stderr = run_command([script_path])

    if code == 0:
        logging.info(f"脚本执行成功: {script_path}, 输出: {stdout}")
    else:
        logging.error(f"脚本执行失败: {script_path}, 错误: {stderr}")


def get_containers():
    """
    获取所有非 exited 状态的容器，包括 created、running 等。
    """
    cmd = [
        "docker",
        "ps",
        "-a",
        "--filter",
        "status=created",
        "--filter",
        "status=running",
        "--filter",
        "status=restarting",
        "--filter",
        "status=paused",
        "--format",
        "{{.Names}}\t{{.CreatedAt}}\t{{.Status}}"
    ]

    code, stdout, stderr = run_command(cmd)

    if code != 0:
        logging.error(f"获取 Docker 容器失败: {stderr}")
        return []

    containers = []

    for line in stdout.splitlines():
        parts = line.split("\t")
        if len(parts) != 3:
            continue

        name, created_at, status = parts

        containers.append({
            "name": name.strip(),
            "created_at": created_at.strip(),
            "status": status.strip()
        })

    return containers


def find_target_containers():
    containers = get_containers()

    matched = []

    for container in containers:
        name = container["name"]

        if CONTAINER_NAME_PATTERN.match(name):
            matched.append(container)

    return matched


def main():
    setup_logging()

    logging.info("开始监控 C.数字 格式的 Docker 容器")

    last_state_has_target = None

    while True:
        try:
            matched_containers = find_target_containers()
            has_target = len(matched_containers) > 0

            if has_target:
                for container in matched_containers:
                    logging.warning(
                        "发现目标容器: name=%s, created_at=%s, status=%s",
                        container["name"],
                        container["created_at"],
                        container["status"]
                    )

                run_script(STOP_SCRIPT)

            else:
                if last_state_has_target is not False:
                    logging.info("未发现目标容器，执行 startmine.sh")

                run_script(START_SCRIPT)

            last_state_has_target = has_target

        except Exception as e:
            logging.exception(f"监控过程中发生异常: {e}")

        time.sleep(CHECK_INTERVAL)


if __name__ == "__main__":
    main()
