import http.server
import socketserver
import os
import json
from urllib.parse import unquote
import urllib.request
import urllib.parse

PORT = 9980
DIR = "/opt/medical_records"
NUTSTORE_WEBDAV = "https://dav.jianguoyun.com/dav/ 医疗记录/"
NUTSTORE_USER = os.environ.get('NUTSTORE_USER', '')
NUTSTORE_PASS = os.environ.get('NUTSTORE_PASS', '')

class CloudSyncHandler(http.server.SimpleHTTPRequestHandler):
    def do_OPTIONS(self):
        self.send_response(200)
        self.send_cors_headers()
        self.end_headers()

    def do_GET(self):
        if self.path.startswith('/webdav/'):
            self.proxy_to_nutstore('GET')
        else:
            super().do_GET()

    def do_PUT(self):
        if self.path.startswith('/webdav/'):
            self.proxy_to_nutstore('PUT')
        else:
            self.send_error(405)

    def do_PROPFIND(self):
        if self.path.startswith('/webdav/'):
            self.proxy_to_nutstore('PROPFIND')
        else:
            self.send_error(405)

    def send_cors_headers(self):
        self.send_header('Access-Control-Allow-Origin', '*')
        self.send_header('Access-Control-Allow-Methods', 'GET, PUT, OPTIONS, PROPFIND')
        self.send_header('Access-Control-Allow-Headers', 'Authorization, Content-Type, Depth')
        self.send_header('Access-Control-Expose-Headers', 'Content-Type, ETag, Content-Length')

    def proxy_to_nutstore(self, method):
        filename = self.path.split('/webdav/')[-1].split('?')[0]
        if not filename:
            filename = 'medical_data.json'
        filename = unquote(filename)
        nutstore_url = NUTSTORE_WEBDAV + urllib.parse.quote(filename)
        print(f"[PROXY] {method} {nutstore_url}")
        content_length = int(self.headers.get('Content-Length', 0)) if method in ['PUT', 'PROPFIND'] else 0
        body = self.rfile.read(content_length) if content_length > 0 else b''
        req = urllib.request.Request(nutstore_url, data=body if body else None, method=method)
        for header in ['Content-Type', 'Content-Length', 'Depth', 'Authorization']:
            if header in self.headers:
                req.add_header(header, self.headers[header])
        if 'Authorization' not in self.headers and NUTSTORE_USER and NUTSTORE_PASS:
            import base64
            auth = base64.b64encode(f"{NUTSTORE_USER}:{NUTSTORE_PASS}".encode()).decode()
            req.add_header('Authorization', f'Basic {auth}')
        try:
            resp = urllib.request.urlopen(req)
            self.send_response(resp.getcode())
            for key, value in resp.getheaders():
                if key.lower() not in ['transfer-encoding', 'connection']:
                    self.send_header(key, value)
            self.send_cors_headers()
            self.end_headers()
            content = resp.read()
            self.wfile.write(content)
            print(f"[PROXY] Done: {resp.getcode()} {len(content)} bytes")
        except urllib.error.HTTPError as e:
            print(f"[PROXY] Error: {e.code}")
            self.send_response(e.code)
            self.send_cors_headers()
            self.end_headers()
        except Exception as e:
            print(f"[PROXY] Exception: {e}")
            self.send_response(500)
            self.send_cors_headers()
            self.end_headers()

    def translate_path(self, path):
        return super().translate_path(path)

if __name__ == '__main__':
    print("=====================================")
    print("   个人医疗记录 - 腾讯云部署版")
    print("=====================================")
    os.chdir(DIR)
    print(f"Listening on port {PORT}")
    print(f"坚果云WebDAV: {NUTSTORE_WEBDAV}")
    if not NUTSTORE_USER:
        print("⚠️  需要设置环境变量 NUTSTORE_USER 和 NUTSTORE_PASS")
    server = socketserver.TCPServer(('', PORT), CloudSyncHandler)
    print("Server started, waiting for connections...")
    server.serve_forever()
