package com.kingdee.eas.custom.integration.base.controller;

import com.kingdee.eas.custom.integration.base.dto.ApiResult;
import com.kingdee.eas.custom.integration.base.exception.CommonErrorCodes;
import com.kingdee.eas.custom.integration.base.exception.IntegrationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;
import java.util.Collection;

/**
 * 业务 Controller 通用基类，封装响应构建、参数校验、分页解析等通用能力。
 *
 * <p>与 {@link AbstractAuthController} 的定位区别：
 * <ul>
 *   <li>AbstractAuthController — OAuth 认证流程基类（doAuth / doCallback）</li>
 *   <li>AbstractIntegrationController — 业务 Controller 通用基类（响应封装 / 参数校验）</li>
 * </ul>
 */
public abstract class AbstractIntegrationController {

    protected final Logger log = LoggerFactory.getLogger(getClass());

    // ======================== 响应构建 ========================

    /**
     * 成功响应（带数据）。
     */
    protected <T> ApiResult<T> success(T data) {
        return ApiResult.success(data);
    }

    /**
     * 成功响应（无数据体）。
     */
    protected ApiResult<Void> success() {
        return ApiResult.success(null);
    }

    /**
     * 失败响应（自定义状态码和消息）。
     */
    protected ApiResult<Void> fail(int code, String message) {
        return ApiResult.fail(code, message);
    }

    /**
     * 失败响应（默认 400）。
     */
    protected ApiResult<Void> fail(String message) {
        return ApiResult.fail(ApiResult.CODE_BAD_REQUEST, message);
    }

    // ======================== 参数校验 ========================

    /**
     * 非空校验，失败时抛出 IntegrationException。
     */
    protected void requireNotNull(Object obj, String fieldName) {
        if (obj == null) {
            throw new IntegrationException(CommonErrorCodes.PARAM_MISSING, fieldName + " 不能为空");
        }
    }

    /**
     * 字符串非空校验。
     */
    protected void requireNotBlank(String str, String fieldName) {
        if (str == null || str.trim().isEmpty()) {
            throw new IntegrationException(CommonErrorCodes.PARAM_MISSING, fieldName + " 不能为空");
        }
    }

    /**
     * 集合非空校验。
     */
    protected void requireNotEmpty(Collection<?> collection, String fieldName) {
        if (collection == null || collection.isEmpty()) {
            throw new IntegrationException(CommonErrorCodes.PARAM_MISSING, fieldName + " 不能为空");
        }
    }

    /**
     * 自定义条件校验。
     */
    protected void requireTrue(boolean condition, String message) {
        if (!condition) {
            throw new IntegrationException(CommonErrorCodes.PARAM_MISSING, message);
        }
    }

    // ======================== 分页参数解析 ========================

    /**
     * 从请求中解析分页参数，默认 pageNum=1, pageSize=20。
     */
    protected PageInfo parsePageRequest(HttpServletRequest request) {
        int pageNum = 1;
        int pageSize = 20;
        String pageNumStr = request.getParameter("pageNum");
        String pageSizeStr = request.getParameter("pageSize");
        if (pageNumStr != null && !pageNumStr.isEmpty()) {
            pageNum = Integer.parseInt(pageNumStr);
        }
        if (pageSizeStr != null && !pageSizeStr.isEmpty()) {
            pageSize = Integer.parseInt(pageSizeStr);
        }
        return new PageInfo(pageNum, pageSize);
    }

    /**
     * 分页参数。
     */
    public static class PageInfo {
        private final int pageNum;
        private final int pageSize;

        public PageInfo(int pageNum, int pageSize) {
            this.pageNum = pageNum;
            this.pageSize = pageSize;
        }

        public int getPageNum() {
            return pageNum;
        }

        public int getPageSize() {
            return pageSize;
        }
    }
}
