package com.ruoyi.app.mendian;

import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.app.utils.newebpay.NewebPay;
import com.ruoyi.app.utils.newebpay.NewebPayConfig;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.dto.StoreNewebpayCredentialDto;
import com.ruoyi.system.domain.vo.PosStoreNewebpayVo;
import com.ruoyi.system.service.IPosStoreNewebpayService;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 平台后台 - 门店蓝新金流支付开通管理。
 *
 * <p><strong>已废弃（2026-09-02 确认）</strong>：蓝新支付方案已放弃，本接口从未在生产启用。
 * 不要参考其业务逻辑，不要在其上做增量修改。
 *
 * <p>蓝新商店注册为线下人工；本接口负责申请状态推进、凭证录入与联网验证（QueryTradeInfo 探测）、
 * 启用开关、支付方式设置。复用 009 PosStoreEzpayController 模式；联网验证放 Controller 层，
 * Service 仅持久化（避免 ruoyi-system 反向依赖 ruoyi-admin 的 NewebPay 工具类）。
 *
 * @author ruoyi
 * @date 2026-06-22
 */
@RestController
@RequestMapping("/system/storeNewebpay")
@Deprecated
public class PosStoreNewebpayController extends BaseController {

    @Autowired
    private IPosStoreNewebpayService posStoreNewebpayService;

    @Autowired
    private NewebPay newebPay;

    @Value("${newebpay.base-url}")
    private String newebpayBaseUrl;

    /** 开通管理列表（分页 + 筛选 + 快捷过滤）。 */
    @PreAuthorize("@ss.hasPermi('chanting:storeNewebpay:list')")
    @GetMapping("/list")
    public TableDataInfo list(PosStoreNewebpayVo query) {
        startPage();
        List<PosStoreNewebpayVo> list = posStoreNewebpayService.selectNewebpayStoreList(query);
        return getDataTable(list);
    }

    /** 门店蓝新详情。 */
    @PreAuthorize("@ss.hasPermi('chanting:storeNewebpay:query')")
    @GetMapping("/{storeId}")
    public AjaxResult getInfo(@PathVariable Long storeId) {
        return success(posStoreNewebpayService.selectNewebpayStoreDetail(storeId));
    }

    /** 发起申请（未申请 0 → 申请中 1）。 */
    @PreAuthorize("@ss.hasPermi('chanting:storeNewebpay:apply')")
    @Log(title = "蓝新发起申请", businessType = BusinessType.UPDATE)
    @PutMapping("/apply/{storeId}")
    public AjaxResult apply(@PathVariable Long storeId) {
        return toAjax(posStoreNewebpayService.apply(storeId));
    }

    /**
     * 录入蓝新凭证并验证：调 QueryTradeInfo 查虚构订单探测金钥，
     * 响应含金钥/商店错误标志视为无效（拒绝、状态不变），否则通过并标记已开通。
     */
    @PreAuthorize("@ss.hasPermi('chanting:storeNewebpay:saveCredentials')")
    @Log(title = "蓝新录入凭证", businessType = BusinessType.UPDATE)
    @PutMapping("/saveCredentials")
    public AjaxResult saveCredentials(@RequestBody @Valid StoreNewebpayCredentialDto dto) {
        NewebPayConfig cfg = new NewebPayConfig(dto.getMerchantId(), dto.getHashKey(), dto.getHashIv());
        // 查一个不存在的订单号，仅用于探测金钥是否被蓝新接受
        String probeOrderNo = "NEBVERIFY" + System.currentTimeMillis();

        String respStr;
        try {
            JSONObject resp = newebPay.queryTrade(newebpayBaseUrl, cfg, "1", probeOrderNo);
            respStr = resp == null ? "" : resp.toJSONString();
        } catch (Exception e) {
            posStoreNewebpayService.recordVerifyResult(dto.getStoreId(), "ERROR: " + msg(e));
            return error("蓝新验证服务暂不可用，请稍后重试");
        }

        // 金钥/商店错误通常在响应中含 HashKey/HashIV/MPG01001 等标志；金钥正确则返回查询类结果（非金钥错误）
        if (looksLikeCredentialError(respStr)) {
            posStoreNewebpayService.recordVerifyResult(dto.getStoreId(), "FAIL: " + truncate(respStr));
            return error("蓝新凭证无效，请检查商店代号 / HashKey / HashIV");
        }

        posStoreNewebpayService.enableWithCredentials(dto);
        return success("凭证验证通过，已开通");
    }

    /** 停用 / 恢复（仅已开通门店）。 */
    @PreAuthorize("@ss.hasPermi('chanting:storeNewebpay:toggleEnable')")
    @Log(title = "蓝新停用恢复", businessType = BusinessType.UPDATE)
    @PutMapping("/toggleEnable/{storeId}")
    public AjaxResult toggleEnable(@PathVariable Long storeId) {
        return toAjax(posStoreNewebpayService.toggleEnable(storeId));
    }

    /** 重置状态（凭证作废/重新申请）。 */
    @PreAuthorize("@ss.hasPermi('chanting:storeNewebpay:query')")
    @Log(title = "蓝新重置状态", businessType = BusinessType.UPDATE)
    @PutMapping("/reset/{storeId}")
    public AjaxResult reset(@PathVariable Long storeId) {
        return toAjax(posStoreNewebpayService.reset(storeId));
    }

    /** 设置启用的支付方式。入参 {enabledPayments: "CREDIT,LINEPAY,APPLEPAY"}。 */
    @PreAuthorize("@ss.hasPermi('chanting:storeNewebpay:toggleEnable')")
    @Log(title = "蓝新支付方式设置", businessType = BusinessType.UPDATE)
    @PutMapping("/enabledPayments/{storeId}")
    public AjaxResult enabledPayments(@PathVariable Long storeId, @RequestBody Map<String, String> body) {
        String eps = body == null ? null : body.get("enabledPayments");
        return toAjax(posStoreNewebpayService.setEnabledPayments(storeId, eps));
    }

    // ===== 内部辅助 =====

    /** 判定响应是否为金钥/商店代号错误（金钥对则不会出现这些标志）。 */
    private static boolean looksLikeCredentialError(String respStr) {
        if (respStr == null || respStr.isEmpty()) {
            return false;
        }
        String u = respStr.toUpperCase();
        return u.contains("HASHKEY") || u.contains("HASHIV")
                || u.contains("MPG01001") || u.contains("CHECKVALUE")
                || u.contains("\"STATUS\":\"MPG01001\"");
    }

    private static String msg(Throwable e) {
        return e.getMessage() == null ? e.getClass().getSimpleName() : e.getMessage();
    }

    private static String truncate(String s) {
        if (s == null) {
            return "";
        }
        return s.length() > 240 ? s.substring(0, 240) : s;
    }
}
