import { NextFunction, Request, Response } from 'express';
import { AnyZodObject, ZodError } from 'zod';
import { logger } from '../../utils/logger';

/**
 * [BIZ_INF_108] 统一 API 契约校验中间件 (ZodValidationMiddleware)
 * @description 核心逻辑：利用 Zod Schema 对 API 请求进行契约校验。
 * 覆盖 body, query, params 三个维度。
 * 拦截不符合规范的请求并返回结构化的 400 错误，保护下游业务逻辑。
 */
export const validateSchema = (schema: AnyZodObject) => {
  return async (req: Request, res: Response, next: NextFunction) => {
    try {
      // 1. 执行契约校验 (Schema Validation)
      // parseAsync 会同时校验 body, query 和 params
      await schema.parseAsync({
        body: req.body,
        query: req.query,
        params: req.params,
      });
      
      // 2. 校验成功，放行
      next();
    } catch (error) {
      // 3. 校验失败，统一返回 400 错误码 (入参错误)
      if (error instanceof ZodError) {
        const details = error.errors.map(err => ({
          field: err.path.slice(1).join('.') || 'root', // 移除第一层 body/query/params
          message: err.message,
          code: err.code
        }));

        logger.warn(`[ZodValidation] Request to ${req.method} ${req.path} rejected:`, details);

        return res.status(400).json({
          success: false,
          error: 'BAD_REQUEST_INVALID_SCHEMA',
          message: '请求参数不符合 API 契约规范',
          details
        });
      }
      
      // 4. 其它内部异常交给全局错误处理
      next(error);
    }
  };
};
