#!/usr/bin/env python3
from http.server import HTTPServer, BaseHTTPRequestHandler
import os
import socket
import subprocess
import threading

SAVE_DIR = os.path.dirname(os.path.abspath(__file__))


def refresh_plot():
    """处理完成后自动重建可视化页面。"""
    print("[绘图] 开始更新 gps_plot.html ...")
    try:
        result = subprocess.run(
            ['/opt/house_gps_flutter/.venv/bin/python', 'gps_plot.py'],
            cwd=SAVE_DIR,
            capture_output=True,
            text=True,
            encoding='utf-8',
            errors='ignore'
        )
        if result.returncode == 0:
            print("[绘图完成] gps_plot.html 已更新")
        else:
            print(f"[绘图失败] returncode: {result.returncode}")
            print(f"stderr: {result.stderr}")
            print(f"stdout: {result.stdout}")
    except Exception as e:
        print(f"[绘图异常] {e}")


def process_data():
    """处理GPS数据文件"""
    print("[处理] 开始处理数据...")
    try:
        result = subprocess.run(
            ['node', 'process_data.js'],
            cwd=SAVE_DIR,
            capture_output=True,
            text=True,
            encoding='utf-8',
            errors='ignore'
        )
        if result.returncode == 0:
            print("[处理完成] data.json 已更新")
            print(result.stdout)
            refresh_plot()
        else:
            print(f"[处理失败] returncode: {result.returncode}")
            print(f"stderr: {result.stderr}")
            print(f"stdout: {result.stdout}")
    except Exception as e:
        print(f"[处理异常] {e}")


class FileHandler(BaseHTTPRequestHandler):
    def handle(self):
        self.connection.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
        super().handle()

    def do_POST(self):
        filename = self.path.strip('/')
        if not filename or filename == '/':
            filename = 'received_file'

        filepath = os.path.join(SAVE_DIR, filename)
        content_length = int(self.headers.get('Content-Length', 0))

        with open(filepath, 'wb') as f:
            f.write(self.rfile.read(content_length))

        print(f"[接收完成] {filename} ({content_length} bytes) -> {filepath}")

        if filename.endswith('.pos'):
            print("[触发] 自动处理数据...")
            threading.Thread(target=process_data, daemon=True).start()

        self.send_response(200)
        self.send_header('Content-Type', 'text/plain')
        self.end_headers()
        self.wfile.write(b'OK')


def main():
    port = 8080
    server = HTTPServer(('', port), FileHandler)
    print("=" * 50)
    print("文件接收服务器已启动")
    print(f"监听端口: {port}")
    print(f"保存目录: {SAVE_DIR}")
    print("自动处理: 开启")
    print("等待接收文件...")
    print("=" * 50)

    try:
        server.serve_forever()
    except KeyboardInterrupt:
        print("\n服务器已关闭")
        server.shutdown()


if __name__ == '__main__':
    main()
