package shop.alien.store.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import shop.alien.entity.result.R;
import shop.alien.entity.store.StoreUser;
import shop.alien.entity.store.vo.StoreUserLogoutListVo;
import shop.alien.entity.store.vo.StoreUserVo;
import shop.alien.entity.store.vo.StoreUserWithStoreVo;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 二期-门店用户 服务类
 *
 * @author ssk
 * @since 2024-12-11
 */
public interface StoreUserService extends IService<StoreUser> {

    /**
     * 手机号获取
     *
     * @param phone 手机号
     * @return StoreUser
     */
    StoreUserVo getUserByPhone(String phone);

    /**
     * 根据店铺用户ID或店铺ID查询店铺用户及绑定店铺信息
     *
     * @param type 查询类型：1-店铺用户ID，2-店铺ID
     * @param id   对应类型的ID
     */
    R<StoreUserWithStoreVo> getStoreUserWithStore(Integer type, Integer id);

    /**
     * 创建token
     *
     * @return
     */
    R<StoreUserVo> createToKen(StoreUser storeUser);

    /**
     * 修改用户状态
     *
     * @param phone 手机号
     * @param type  修改类型 (pass:密码状态改为1, face:人脸状态改为2)
     * @return StoreUser
     */
    boolean updateUserStatus(String phone, String type);

    /**
     * 修改密码
     *
     * @param id       主键
     * @param password 密码
     * @return boolean
     */
    boolean updatePassword(Integer id, String password);

    /**
     * 修改密码或忘记密码
     *
     * @param phone   手机号
     * @param oldPassword 原密码
     * @param newPassword       新密码
     * @param confirmNewPassword 确认密码
     * @param type 类型
     * @return boolean
     */
    R<String> forgetOrModifyPassword(String phone, String newPhone, String oldPassword, String newPassword,String confirmNewPassword,String verificationCode,  Integer type);

    /**
     * 更换绑定手机号 效验原手机密码或者验证码
     *
     * @param phone   手机号
     * @param oldPassword 原密码
     * @param verificationCode 验证码
     */
    Map<String,String> changePhoneVerification(String phone, String oldPassword, String verificationCode);

    /**
     * 设置用户信息
     * @return boolean
     */
    boolean setUserInfo(StoreUser storeUserVo);

    /**
     * 修改支付密码
     *
     * @param id          主键
     * @param payPassword 支付密码
     * @return boolean
     */
    boolean setPayPassword(Integer id, String payPassword);

    /**
     * 新增商家端用户
     *
     * @return boolean
     */
    R<StoreUserVo> addStoreUser(StoreUserVo storeUserVo);

    /**
     * web端查询用户列表
     *
     * @return boolean
     */
    R<IPage<StoreUserVo>> getStoreUserList(int pageNum, int pageSize, String id, String phone, Integer status, Integer accountType, String mainAccountId, String mainAccountPhone);


    /**
     * web端编辑用户列表
     *
     * @return boolean
     */
    R<StoreUserVo> editStoreUser(StoreUser storeUser);

    /**
     * web端编辑用户列表
     *
     * @return boolean
     */
    void resetStoreUserPassword(StoreUser storeUser);



    /**
     * web端切换商家端用户状态
     *
     * @return boolean
     */
    R<StoreUserVo> switchingStates(StoreUser storeUser);


    /**
     * web端导出商家端账号相关信息
     */
    String exportExcel(String id, String phone, String status, Integer accountType) throws IOException;


    /**
     * 商户端校验
     *
     * @param phone
     * @return
     */
    public boolean checkRegister(String phone);

    /**
     * 商户端登录校验
     *
     * @param phone
     * @return
     */
    public R<StoreUser> checkLogin(String phone);

    /***
     * 商户端注册
     * @param phone
     * @param password
     * @return
     */
    R<Boolean> register(String phone, String password);

    /**
     * 效验商家端账号注销。
     * accountMoney/accountStore/accountDiningOrder/accountReservationOrder：0 未通过，1 通过；
     * accountDiningOrderCount/accountReservationOrderCount：未完成订单数量。
     */
    Map<String,String> storeCancelAccountVerification(StoreUserVo storeUserVo);

    /**
     * 商家端注销用户
     */
    void storeCancelAccount(StoreUserVo storeUserVo);

    /**
     * 商家端撤回注销用户
     */
    void storeCancelAccountUn(StoreUserVo storeUserVo);

    /**
     * 手动删除商家账号及店铺 进行校验
     * @return 成功返回 null；失败返回具体原因：当前账号下存在店铺 禁止删除 / 当前账号下存在子账号禁止删除 / 删除失败
     */
    String deleteStoreAccountInfo(StoreUser storeUser);

    /**
     * 获取主键集合
     *
     * @param name
     * @param phone
     * @return
     */
    List<String> getIds(String name, String phone);

    R<Boolean> havePayPassword(String storeUserId, String password);

    List<StoreUser> getSubAccountsByMainAccountId(Integer mainAccountId);


    List<StoreUser> getChildAccountsByParentId(String Id);

    /**
     * 中台-商家注销列表（store_user）
     *
     * @param pageNum  页码
     * @param pageSize 页大小
     * @param userName 用户名（store_user.name 模糊）
     * @param phone    手机号模糊
     * @param logoutFlag 注销标记：1已注销，2注销冷静期
     */
    IPage<StoreUserLogoutListVo> getStoreUserLogoutPage(int pageNum, int pageSize, String userName, String phone, Integer logoutFlag);
}
