#!/usr/bin/env python3
"""
madeinachuang-form 后端 v2
接收 webhook + phone → 转发到指定的企业微信群机器人 webhook
"""

import http.server
import json
import urllib.request
import urllib.error
import sys

HOST = "0.0.0.0"
PORT = 3901


class FormHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == "/madeinachuang/" or self.path == "/madeinachuang":
            self.send_response(200)
            self.send_header("Content-Type", "text/html; charset=utf-8")
            self.end_headers()
            self.wfile.write(b"madeinachuang API - POST /madeinachuang/api/submit")
        else:
            self.send_response(404)
            self.send_header("Content-Type", "text/plain; charset=utf-8")
            self.end_headers()
            self.wfile.write(b"404 Not Found")

    def do_POST(self):
        if self.path == "/madeinachuang/api/submit":
            content_length = int(self.headers.get("Content-Length", 0))
            body = self.rfile.read(content_length)
            try:
                data = json.loads(body)
                webhook_url = data.get("webhook", "").strip()
                phone = data.get("phone", "").strip()

                # 校验参数
                if not webhook_url:
                    self._json_response(400, {"ok": False, "error": "webhook 不能为空"})
                    return

                if not webhook_url.startswith("https://qyapi.weixin.qq.com/cgi-bin/webhook/send"):
                    self._json_response(400, {"ok": False, "error": "webhook 格式不正确，需为企业微信群机器人 webhook 地址"})
                    return

                if not phone:
                    self._json_response(400, {"ok": False, "error": "手机号不能为空"})
                    return

                if not phone.isdigit() or len(phone) != 11:
                    self._json_response(400, {"ok": False, "error": "手机号必须为 11 位数字"})
                    return

                # 转发到指定的企业微信 webhook
                webhook_payload = {
                    "msgtype": "text",
                    "text": {
                        "content": f"📞 用户提交手机号：{phone}"
                    }
                }
                req = urllib.request.Request(
                    webhook_url,
                    data=json.dumps(webhook_payload).encode("utf-8"),
                    headers={"Content-Type": "application/json"},
                    method="POST"
                )
                resp = urllib.request.urlopen(req, timeout=15)
                resp_body = resp.read()
                resp_code = resp.getcode()

                if resp_code == 200:
                    print(f"[OK] 转发成功: {phone} -> {webhook_url[:50]}...")
                    self._json_response(200, {"ok": True})
                else:
                    print(f"[ERR] webhook 返回 {resp_code}: {resp_body}")
                    self._json_response(500, {"ok": False, "error": "通知发送失败"})

            except json.JSONDecodeError:
                self._json_response(400, {"ok": False, "error": "无效的请求格式"})
            except urllib.error.HTTPError as e:
                print(f"[ERR] webhook HTTP {e.code}: {e.read().decode()}")
                self._json_response(500, {"ok": False, "error": f"webhook 拒绝请求（{e.code}）"})
            except urllib.error.URLError as e:
                print(f"[ERR] webhook 请求失败: {e.reason}")
                self._json_response(500, {"ok": False, "error": "通知服务异常"})
            except Exception as e:
                print(f"[ERR] 未知错误: {e}")
                self._json_response(500, {"ok": False, "error": "服务器错误"})
        else:
            self._json_response(404, {"ok": False, "error": "Not Found"})

    def _json_response(self, status, data):
        self.send_response(status)
        self.send_header("Content-Type", "application/json; charset=utf-8")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.end_headers()
        self.wfile.write(json.dumps(data).encode("utf-8"))

    def log_message(self, format, *args):
        print(f"[{self.address_string()}] {format % args}")


if __name__ == "__main__":
    server = http.server.HTTPServer((HOST, PORT), FormHandler)
    print(f"[启动] madeinachuang-form v2 运行在 http://{HOST}:{PORT}")
    print(f"[启动] API: http://{HOST}:{PORT}/madeinachuang/api/submit")
    print(f"[启动] 参数: POST {{webhook, phone}}")
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        print("\n[停止] 服务关闭")
        server.server_close()