import type { NextRequest } from "next/server";
import { z } from "zod";
import { rateLimit } from "@/lib/rate-limit";
import { getClientIp } from "@/lib/current-user";
import { getRedis } from "@/lib/redis";
import { ok, ERR } from "@/lib/api-response";

const Body = z.object({
  phone: z
    .string()
    .regex(/^1[3-9]\d{9}$/, "请输入有效的中国大陆手机号"),
});

/**
 * POST /api/auth/send-otp
 * 发送短信验证码 · 单手机号 60s 限频 / 单 IP 5 分钟 5 次
 */
export async function POST(req: NextRequest) {
  try {
    const parsed = Body.safeParse(await req.json());
    if (!parsed.success) {
      return ERR.VALIDATION(parsed.error.issues[0]?.message ?? "参数错误");
    }
    const { phone } = parsed.data;

    // 限流
    const phoneRl = await rateLimit(`otp:phone:${phone}`, 60, 1);
    if (!phoneRl.allowed) {
      return ERR.RATE_LIMITED();
    }
    const ip = await getClientIp();
    if (ip) {
      const ipRl = await rateLimit(`otp:ip:${ip}`, 300, 5);
      if (!ipRl.allowed) return ERR.RATE_LIMITED();
    }

    // 生成 6 位验证码
    const code = String(Math.floor(100000 + Math.random() * 900000));

    // 缓存到 Redis（5 分钟过期）
    const redis = getRedis();
    if (redis) {
      await redis.set(`sms:otp:${phone}`, code, "EX", 300);
    }

    // TODO[团队]: 接入真实短信服务（阿里云 / 火山引擎 SMS）
    //   - 模板：${SMS_TEMPLATE_CODE}
    //   - 签名：${SMS_SIGN_NAME}
    //   - 参数：{ code, expireMin: 5 }
    if (process.env.NODE_ENV !== "production") {
      console.log(`[dev-otp] 发送给 ${phone}: ${code}（开发环境也接受万能码 123456）`);
    }

    return ok({ message: "验证码已发送", expiresIn: 300 });
  } catch (e) {
    console.error("[POST /api/auth/send-otp]", e);
    return ERR.INTERNAL();
  }
}
