package com.ruoyi.app.order;

import java.util.List;

import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.system.domain.InfoInvoice;
import com.ruoyi.system.service.IInfoInvoiceService;
import com.ruoyi.system.utils.Auth;
import com.ruoyi.system.utils.JwtUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 用户发票抬头管理 Controller（发票信息管理）
 * <p>镜像 InfoAddressController 的 App 端风格：@Anonymous @Auth + token header + JWT 取 userId。
 * 用户隔离：写库前强制 setUserId、查/改/删按 userId 归属校验。</p>
 *
 * @author foodie
 * @date 2026-07-24
 */
@Api("用户发票抬头管理")
@RestController
@RequestMapping("/system/invoice")
public class InfoInvoiceController extends BaseController
{
    @Autowired
    private IInfoInvoiceService infoInvoiceService;

    /**
     * 列出当前用户的全部发票抬头（按 id 倒序）。
     * <p>每行带 category（B2C/B2B）作为类型区分依据，前端按 category 渲染不同字段。</p>
     */
    @Anonymous
    @Auth
    @ApiOperation("列出我的发票抬头（按 category 区分 B2C/B2B）")
    @GetMapping("/getinvoice")
    public AjaxResult getinvoice(@RequestHeader String token)
    {
        Long userId = Long.valueOf(new JwtUtil().getusid(token));
        List<InfoInvoice> list = infoInvoiceService.listByUserId(userId);
        return success(MessageUtils.message("no.obtained.success"), list);
    }

    /**
     * 新增或更新发票抬头（saveOrUpdate：有 id 更新、无 id 新增）。
     * <p>入参字段随 category 变化（见 InfoInvoice 字段备注 / contracts）：B2C 传载具、B2B 传统编。
     * 字段格式由 @Valid 注解先校验，条件必填与类型互斥由 service 强校验。</p>
     */
    @Anonymous
    @Auth
    @ApiOperation("新增/修改发票抬头（按 category 决定必填字段）")
    @PostMapping("/invoice")
    public AjaxResult invoice(@RequestHeader String token, @Valid @RequestBody InfoInvoice infoInvoice)
    {
        Long userId = Long.valueOf(new JwtUtil().getusid(token));
        boolean ok = infoInvoiceService.saveOrUpdateMine(infoInvoice, userId);
        return ok ? success() : error();
    }

    /**
     * 发票抬头详情（越权 / 不存在返回 null）。
     */
    @Anonymous
    @Auth
    @ApiOperation("发票抬头详情")
    @GetMapping("/getinvoicexq")
    public AjaxResult getinvoicexq(@RequestHeader String token, @RequestParam Long id)
    {
        Long userId = Long.valueOf(new JwtUtil().getusid(token));
        InfoInvoice invoice = infoInvoiceService.getMine(id, userId);
        return success(MessageUtils.message("no.obtained.success"), invoice);
    }

    /**
     * 删除发票抬头（越权 / 不存在返回失败）。
     */
    @Anonymous
    @Auth
    @ApiOperation("删除发票抬头")
    @GetMapping("/deleinvoice")
    public AjaxResult deleinvoice(@RequestHeader String token, @RequestParam Long id)
    {
        Long userId = Long.valueOf(new JwtUtil().getusid(token));
        boolean ok = infoInvoiceService.deleteMine(id, userId);
        return ok ? success() : error("抬头不存在或无权操作");
    }
}
