package shop.alien.dining.feign;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
import shop.alien.entity.result.R;
import shop.alien.entity.store.LifeCollect;
import shop.alien.entity.store.vo.LifeDiscountCouponVo;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 点餐模块调用 alien-store（发码、校验、优惠券等）
 *
 * @author ssk
 * @version 1.0
 * @date 2024/12/4
 */
@FeignClient(name = "alienStoreFeign", url = "${feign.alienStore.url:}")
public interface AlienStoreFeign {

    /**
     * 校验短信验证码（复用 store 阿里云短信）
     *
     * @param phone        手机号
     * @param appType      0:用户 1:商家 2:商家web
     * @param businessType 3:修改手机号
     * @param code         验证码
     */
    @GetMapping("ali/checkSmsCode")
    R<?> checkSmsCode(
            @RequestParam("phone") String phone,
            @RequestParam("appType") Integer appType,
            @RequestParam("businessType") Integer businessType,
            @RequestParam("code") Integer code);

    // ==================== 优惠券接口（Feign 调 store life-discount-coupon） ====================

    /**
     * 获取用户优惠券列表（分 tab：全部/即将过期/已使用/已过期）
     *
     * @param authorization 请求头 Authorization，供 store 解析当前用户
     * @param tabType       0：全部（未使用），1：即将过期，2：已使用，3：已过期
     * @param page          页码（默认1）
     * @param size          每页条数（默认10）
     * @param type          券类型（不传：优惠券+代金券都返回，1：仅优惠券查 life_discount_coupon，4：仅代金券查 life_coupon）（可选）
     * @param couponType    优惠券类型：1=仅满减券，2=仅折扣券，不传=全部优惠券（可选，仅当type不为4时有效）
     * @param storeId       商铺ID，可为空，传则仅返回该商铺的优惠券
     * @param storeKeyword  店铺名称关键字，可为空，非空时仅返回门店名称包含关键字的优惠券
     * @return R.data 为 List&lt;LifeDiscountCouponVo&gt;
     */
    @GetMapping("life-discount-coupon/getUserCouponList")
    R<List<LifeDiscountCouponVo>> getUserCouponList(
            @RequestHeader(value = "Authorization", required = false) String authorization,
            @RequestParam("tabType") String tabType,
            @RequestParam(value = "page", defaultValue = "1") int page,
            @RequestParam(value = "size", defaultValue = "10") int size,
            @RequestParam(value = "type", required = false) Integer type,
            @RequestParam(value = "couponType", required = false) Integer couponType,
            @RequestParam(value = "storeId", required = false) String storeId,
            @RequestParam(value = "storeKeyword", required = false) String storeKeyword);

    /**
     * 根据优惠券 ID 获取优惠券详情（含规则、门槛等）
     *
     * @param authorization 请求头 Authorization
     * @param counponId      优惠券 id（接口拼写为 counponId）
     * @return R.data 为 LifeDiscountCouponVo
     */
    @GetMapping("life-discount-coupon/getCounponDetailById")
    R<LifeDiscountCouponVo> getCounponDetailById(
            @RequestHeader(value = "Authorization", required = false) String authorization,
            @RequestParam("counponId") String counponId);

    /**
     * 获取该门店下用户可用/不可用优惠券列表（按消费金额区分）
     * couponType=1仅满减券，couponType=2仅折扣券，不传返回全部优惠券
     *
     * @param authorization 请求头 Authorization
     * @param storeId        门店 id
     * @param amount         当前消费金额（用于满减门槛判断）
     * @param couponType     优惠券类型：1=仅满减券，2=仅折扣券，不传=全部优惠券（可选）
     * @return R.data 为 Map：canUseLifeDiscountCouponVos、forbidUseLifeDiscountCouponVos
     */
    @GetMapping("life-discount-coupon/getStoreUserUsableCouponList")
    R<Map<String, Object>> getStoreUserUsableCouponList(
            @RequestHeader(value = "Authorization", required = false) String authorization,
            @RequestParam("storeId") String storeId,
            @RequestParam("amount") BigDecimal amount,
            @RequestParam(value = "couponType", required = false) Integer couponType);

    /**
     * 获取该用户该店铺优惠券列表
     * couponType=1仅满减券，couponType=2仅折扣券，不传返回全部优惠券
     *
     * @param authorization 请求头 Authorization，供 store 解析当前用户
     * @param storeId       商户id
     * @param couponType    优惠券类型：1=仅满减券，2=仅折扣券，不传=全部优惠券（可选）
     * @return R.data 为 List&lt;LifeDiscountCouponVo&gt;
     */
    @GetMapping("life-discount-coupon/getStoreUserCouponList")
    R<List<LifeDiscountCouponVo>> getStoreUserCouponList(
            @RequestHeader(value = "Authorization", required = false) String authorization,
            @RequestParam("storeId") String storeId,
            @RequestParam(value = "couponType", required = false) Integer couponType);

    /**
     * 获取该店铺所有优惠券（分页）, 好友优惠券
     * couponType=1仅满减券，couponType=2仅折扣券，不传返回全部优惠券
     *
     * @param authorization   请求头 Authorization，供 store 解析当前用户
     * @param page            页码（默认1）
     * @param size            每页条数（默认10）
     * @param storeId         商户id
     * @param couponName      优惠券名称（可选）
     * @param tab             分页类型(0:全部，1:进行中，2:已结束，3:草稿，4:未开始，5:已下架，6:已清库)
     * @param couponsFromType 查询类型(1:我的优惠券，2:好友的优惠券)（默认1）
     * @param couponStatus    优惠券状态(0:草稿，1:正式)（默认1）
     * @param couponType      优惠券类型：1=仅满减券，2=仅折扣券，不传=全部优惠券（可选）
     * @return R.data 为 Page&lt;LifeDiscountCouponVo&gt;（使用 Page 而不是 IPage，因为 Feign 需要具体类型进行反序列化）
     */
    @GetMapping("life-discount-coupon/getStoreAllCouponList")
    R<Page<LifeDiscountCouponVo>> getStoreAllCouponList(
            @RequestHeader(value = "Authorization", required = false) String authorization,
            @RequestParam(value = "page", defaultValue = "1") int page,
            @RequestParam(value = "size", defaultValue = "10") int size,
            @RequestParam("storeId") String storeId,
            @RequestParam(value = "couponName", required = false) String couponName,
            @RequestParam("tab") String tab,
            @RequestParam(value = "couponsFromType", defaultValue = "1") int couponsFromType,
            @RequestParam(value = "couponStatus", defaultValue = "1", required = false) int couponStatus,
            @RequestParam(value = "couponType", required = false) Integer couponType);

    // ==================== 收藏接口 ====================

    /**
     * 添加收藏
     *
     * @param lifeCollect 收藏对象
     * @return R.data 为 Boolean（是否成功）
     */
    @PostMapping("/collect/addCollect")
    R<Boolean> addCollect(@RequestBody LifeCollect lifeCollect);

    // ==================== 文件上传接口 ====================

    /**
     * 上传图片到OSS（单个文件上传，支持图片、视频或PDF）
     *
     * @param file 文件对象
     * @return R.data 为文件路径（String）
     */
    @PostMapping(value = "/file/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    R<String> uploadFile(@RequestPart("file") MultipartFile file);
}
