package com.seer.teach.mall.service;

import com.seer.teach.common.ResultBean;
import com.seer.teach.mall.entity.AddressEntity;
import com.baomidou.mybatisplus.extension.service.IService;
import com.seer.teach.mall.request.AddressSaveReq;
import com.seer.teach.mall.request.AddressSetDefaultReq;
import com.seer.teach.mall.request.AddressUpdateReq;
import com.seer.teach.mall.response.AddressResp;

import java.util.List;
import java.util.Optional;

/**
 * <p>
 * 收货地址服务接口类
 * </p>
 *
 * @author Captain
 * @since 2025-06-10
 */
public interface IAddressService extends IService<AddressEntity> {

    /**
     * 查询当前用户的所有收货地址信息列表
     *
     * @return 返回当前用户的所有收货地址信息列表
     */
    List<AddressResp> listAddress();

    /**
     * 新增用户的收货地址信息
     *
     * @param params 包含新增收货地址信息的请求参数对象
     * @return 返回新增成功的收货地址信息
     */
    AddressResp saveAddress(AddressSaveReq params);

    /**
     * 根据Id查询收货地址信息，如果指定ID的地址不存在则返回默认地址，
     * 如果没有默认地址则返回空Optional对象
     *
     * @param id 收货地址ID
     * @return 返回指定ID的收货地址信息，或默认地址，或空Optional对象
     */
    Optional<AddressResp> getAddressByIdIfDefault(Integer id);

    /**
     * 根据Id查询收货地址信息
     *
     * @param id 收货地址ID
     * @return 返回指定ID的收货地址信息
     */
    AddressResp getAddressById(Integer id);

    /**
     * 修改收货地址信息
     *
     * @param params 包含修改收货地址信息的请求参数对象
     * @return 返回操作结果，包含是否成功以及相关信息
     */
    boolean updateAddress(AddressUpdateReq params);

    /**
     * 根据Id删除收货地址信息
     *
     * @param id 需要删除的收货地址ID
     * @return 返回操作结果，包含是否成功以及相关信息
     */
    boolean deleteAddress(Integer id);

    /**
     * 设置默认地址
     *
     * @param params 包含设置默认地址信息的请求参数对象
     * @return 返回操作结果，包含是否成功以及相关信息
     */
    boolean setDefaultAddress(AddressSetDefaultReq params);

    /**
     * 查询当前用户的默认地址
     *
     * @return 返回当前用户的默认收货地址信息
     */
    AddressResp getDefaultAddress();
}