#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import subprocess
import signal
import time
from datetime import datetime

# -----------------------------
# 基本設定
# -----------------------------
CONFIG_FILE = "ww_config"

URL_RTSP = "rtsp://admin:@192.168.1.9:10553"
OUTPUT_WIDTH = 480
OUTPUT_HEIGHT = 320
OUTPUT_FILE = "../Canby/XV1900CU.bin"

LOCK_FILE = "/tmp/WW.lock"
PID_FILE = "/tmp/WW_main.pid"
STOP_FILE = "/tmp/WW.stop"

EXPECTED_SIZE = OUTPUT_WIDTH * OUTPUT_HEIGHT * 2

# ログはデフォルトOFF
LOG_ENABLE = False
LOG_FILE = "./WW.log"

# 夜間モードデフォルト設定
SETTINGS = {
    "OFF_START_HOUR": 21,
    "OFF_END_HOUR": 9,
    "OFF_FILE_SIZE": 50,
    "CHECK_INTERVAL": 10
}

# -----------------------------
# 設定読み込み
# -----------------------------
def load_config():
    if not os.path.exists(CONFIG_FILE):
        return

    try:
        with open(CONFIG_FILE) as f:
            for line in f:
                line = line.strip()
                if not line or line.startswith("#"):
                    continue
                if "=" in line:
                    key, value = line.split("=", 1)
                    key = key.strip()
                    value = value.strip()

                    if key in SETTINGS:
                        SETTINGS[key] = int(value)

    except Exception as e:
        log_message(f"config読み込みエラー: {e}")

# -----------------------------
# ログ関数
# -----------------------------
def log_message(msg):
    if not LOG_ENABLE:
        return

    try:
        with open(LOG_FILE, "a") as f:
            f.write(f"[{time.strftime('%F %T')}] {msg}\n")
    except:
        pass

# -----------------------------
# 夜間判定
# -----------------------------
def is_night_mode():
    now = datetime.now().hour
    start = SETTINGS["OFF_START_HOUR"]
    end = SETTINGS["OFF_END_HOUR"]

    if start > end:
        return now >= start or now < end
    else:
        return start <= now < end

# -----------------------------
# DIMファイル生成
# -----------------------------
def create_dim_file():
    try:
        size = SETTINGS["OFF_FILE_SIZE"]

        data = b"DIM!"
        data += int(time.time()).to_bytes(4, "little")
        data += b"\x00" * (size - len(data))
        data = data[:size]

        with open(OUTPUT_FILE, "wb") as f:
            f.write(data)

        log_message("夜間DIMファイル作成")

    except Exception as e:
        log_message(f"DIMファイル作成エラー: {e}")

# -----------------------------
# 高速更新
# -----------------------------
def run_update():
    log_message("ffmpeg高速更新開始")

    ffmpeg_cmd = [
        "ffmpeg",
        "-loglevel", "error",
        "-rtsp_transport", "tcp",
        "-i", URL_RTSP,
        "-vf", f"scale={OUTPUT_WIDTH}:{OUTPUT_HEIGHT},format=rgb565be",
        "-pix_fmt", "rgb565be",
        "-f", "rawvideo",
        "-"
    ]

    proc = subprocess.Popen(ffmpeg_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    while not os.path.exists(STOP_FILE):

        load_config()

        # --- 夜間モード ---
        if is_night_mode():
            create_dim_file()
            time.sleep(SETTINGS["CHECK_INTERVAL"])
            continue

        # --- 通常モード ---
        frame = proc.stdout.read(EXPECTED_SIZE)

        if len(frame) == EXPECTED_SIZE:
            with open(OUTPUT_FILE, "wb") as f:
                f.write(frame)
        else:
            time.sleep(0.05)

    proc.terminate()
    proc.wait()
    log_message("ffmpeg高速更新終了")

# -----------------------------
# 停止処理
# -----------------------------
def stop_all():
    open(STOP_FILE, "w").close()

    if os.path.exists(PID_FILE):
        with open(PID_FILE) as f:
            pid = int(f.read())
        try:
            os.kill(pid, signal.SIGTERM)
        except:
            pass

    time.sleep(1)

    for f in [LOCK_FILE, PID_FILE, STOP_FILE]:
        if os.path.exists(f):
            os.remove(f)

    print("停止しました")

# -----------------------------
# 起動処理
# -----------------------------
def start_bg():
    if os.path.exists(LOCK_FILE):
        print("既に起動中")
        return

    open(LOCK_FILE, "w").close()

    if os.path.exists(STOP_FILE):
        os.remove(STOP_FILE)

    pid = os.fork()
    if pid > 0:
        with open(PID_FILE, "w") as f:
            f.write(str(pid))
        print(f"高速更新 起動しました (PID: {pid})")
        return

    run_update()
    os._exit(0)

# -----------------------------
# メイン
# -----------------------------
if len(sys.argv) < 2:
    print("Usage: WW.py start|stop|restart|status")
    sys.exit(1)

cmd = sys.argv[1].lower()

if cmd == "start":
    start_bg()

elif cmd == "stop":
    stop_all()

elif cmd == "restart":
    stop_all()
    time.sleep(1)
    start_bg()

elif cmd == "status":
    if os.path.exists(LOCK_FILE) and os.path.exists(PID_FILE):
        with open(PID_FILE) as f:
            pid = int(f.read())
        try:
            os.kill(pid, 0)
            print(f"実行中 (PID: {pid})")
        except:
            print("ロックあり・プロセスなし")
    else:
        print("停止中")

else:
    print("Usage: WW.py start|stop|restart|status")


