import argparse
from datetime import datetime
import json
import re
import subprocess


def range_check(start, end, core_time):
    start_time = datetime.strptime(start, "%Y-%m-%d %H:%M:%S") if start else None
    end_time = datetime.strptime(end, "%Y-%m-%d %H:%M:%S") if end else None
    if start_time and core_time < start_time:
        return False
    if end_time and core_time > end_time:
        return False
    return True


def reboot_detect(start, end):
    try:
        process = subprocess.Popen(
            ["journalctl", "-u", "systemd-reboot.service", "-o", "json"],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
        )
        output, error = process.communicate()

        if process.returncode != 0:
            print("Failed to execute journalctl command:", error)
            return []

    except Exception as e:
        print("Error occurred:", str(e))
        return []

    reboots = []

    for line in output.splitlines():
        try:
            log_entry = json.loads(line)
            message = log_entry.get("MESSAGE", "")
            if "Reboot" not in message:
                continue
            # Alinx2: Starting Reboot...
            # Ubuntu: System Reboot
            # Alinux3: Started Reboot

            # Convert the timestamp from microseconds to seconds and parse
            timestamp = datetime.fromtimestamp(
                int(log_entry["__REALTIME_TIMESTAMP"]) / 1e6
            )
            formatted_time = timestamp.strftime("%Y-%m-%d %H:%M:%S")

            if not range_check(start, end, timestamp):
                continue

            reboots.append({"time": formatted_time, "event": message})
        except json.JSONDecodeError:
            continue

    return reboots


def main():
    parser = argparse.ArgumentParser(description="reboot record check tool")

    parser.add_argument(
        "-s",
        "--starttime",
        type=str,
        required=False,
        default="",
        help="start time (format: YYYY-MM-DD HH:MM:SS)",
    )
    parser.add_argument(
        "-e",
        "--endtime",
        type=str,
        required=False,
        default="",
        help="end time (format: YYYY-MM-DD HH:MM:SS)",
    )
    args = parser.parse_args()
    reboots = reboot_detect(args.starttime, args.endtime)
    sorted_reboots = sorted(
        reboots,
        key=lambda k: datetime.strptime(k["time"], "%Y-%m-%d %H:%M:%S"),
        reverse=True,
    )
    print(json.dumps(sorted_reboots, indent=4, ensure_ascii=False))


if __name__ == "__main__":
    main()
