package com.ytpm.question.dao;

import com.ytpm.agent.param.AuditUserParam;
import com.ytpm.agent.view.AgentAuditCheckVO;
import com.ytpm.app.model.YtAppDefaultConfig;
import com.ytpm.app.model.YtDyzPowerRecord;
import com.ytpm.app.model.YtDyzUser;
import com.ytpm.app.param.AppUserParam;
import com.ytpm.app.param.YtAppUserListParam;
import com.ytpm.app.view.HourCountView;
import com.ytpm.app.view.WxDefaultConfig;
import com.ytpm.app.view.YtAppUserListView;
import com.ytpm.middle.view.AppRankingListVO;
import com.ytpm.middle.view.AppUserHourVO;
import com.ytpm.middle.view.UserRankingListVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

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

@Mapper
public interface AppUserMapper {

    /**
     * openid查询用户信息
     */
    YtDyzUser getYtAppUser(@Param("openid")String openid,@Param("ditchId")long ditchId);

    /**
     * 主键查询
     */
    YtDyzUser selectPrimaryKey(@Param("userId")String userId);

    /**
     * 新增应用用户
     */
    void addOne(YtDyzUser user);

    /**
     * 增加体力
     */
    void addOnePower(@Param("userId")String userId);
    /**
     * 减少体力
     */
    void subOnePower(@Param("userId")String userId);

    /**
     * 体力增加记录
     */
    void addPowerRecord(YtDyzPowerRecord record);

    /**
     * 修改用户信息
     */
    void updateUser(YtDyzUser newUser);
    /**
     * 查询所有玩家
     */
    List<YtAppUserListView> queryAll(YtAppUserListParam param);

    /**
     * 查询所有玩家
     * 按照注册时间范围查询
     * @param startTime 开始时间(可选)
     * @param endTime 结束时间(可选)
     */
    List<YtDyzUser> queryAllByTime(
            @Param("startTime") Date startTime,
            @Param("endTime") Date endTime,
            @Param("appIdList") List<String> appIdList
    );

    List<HourCountView> countUsersByHour(@Param("startTime") Date startTime,
                                         @Param("endTime") Date endTime,
                                         @Param("appIdList") List<String> appIdList
    );

    List<YtDyzUser> queryTodayBanned(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("userIdList") List<String> userIdList);

    /**
     * 查询用户信息
     */
    List<YtDyzUser> getUserList(AppUserParam param);

    /**
     * 根据应用类型查询应用默认配置
     */
    WxDefaultConfig getDefaultConfig(@Param("appType") int appType);

    WxDefaultConfig getDefaultConfigByAppId(@Param("appId") String appId);

    /**
     * 根据微信openid查询用户
     */
    List<YtDyzUser> queryByOpenid(@Param("openid")String openid);

    /**
     * 根据设备ID查询平台ID
     */
    String getByDeviceId(@Param("deviceId")String deviceId,@Param("openid")String openid);

    /**
     * 保存应用配置
     */
    void saveAppConfig(YtAppDefaultConfig defaultConfig);
    /**
     * 修改应用配置
     */
    void updateAppConfig(YtAppDefaultConfig defaultConfig);


    /**
     * 根据APP_ID获取配置
     */
    List<WxDefaultConfig> getConfigByIds(@Param("appIds") String appIds);

    /**
     * 根据应用统计广告数
     */
    int getAdCount(@Param("appIds") String appIds);

    /**
     * 根据应用统计收益
     */
    BigDecimal getRevenueCount(@Param("appIds") String appIds);

    /**
     * 查询应用排行榜
     */
    List<AppRankingListVO> getAppRanking(@Param("beginTime") Date beginTime,@Param("endTime") Date endTime,@Param("limit") int limit);

    /**
     * 查询用户排行榜数据
     */
    List<UserRankingListVO> getUserRanking(@Param("beginTime") Date beginTime,@Param("endTime") Date endTime,@Param("limit") int limit);

    /**
     * 根据应用查询用户数量
     */
    int countUserByAppIds(@Param("appIds")String appIds);

    /**
     * 根据应用统计预估收益
     */
    BigDecimal countRevenueByAppIds(@Param("appIds")String appIds);

    /**
     * 根据应用查询风控用户数
     */
    int countBannedByAppIds(@Param("appIds")String appIds);

    /**
     * 统计注册用户数
     */
    int countRegistryUser(@Param("appId")String appId, @Param("type")int type);
    /**
     * 统计登录用户数
     */
    int countLoginUser(@Param("appId")String appId, @Param("type")int type);

    /**
     * 分时统计注册数
     */
    List<AppUserHourVO> countRegistryHour(@Param("appId")String appId, @Param("type")int type);

    /**
     * 分时统计登录
     */
    List<AppUserHourVO> countLoginHour(@Param("appId")String appId, @Param("type")int type);

    /**
     * 根据应用ID删除默认配置
     */
    void delByAppId(@Param("appId")String appId);

    void unlockUser(@Param("userIds")String userIds);

    List<YtDyzUser> queryByUserIds(@Param("userIds")String userIds);

    /**
     * 分类型查询用户当天视频广告
     */
    List<AgentAuditCheckVO> queryTodayUserAd(AuditUserParam auditParam);

    List<YtDyzUser> getMonthRegistryUser(@Param("appIds") String appIds, @Param("type") Integer type);

    /**
     * 查询设备指定天数内注册的渠道数
     */
    int countDitch(@Param("deviceId")String deviceId,@Param("hours")int hours);

    /**
     * 查询设备指定时间内登录的用户和渠道
     */
    int countLoginDitch(@Param("deviceId")String deviceId,@Param("hours")int hours);

    /**
     * 查询设备最新注册的用户
     */
    List<YtDyzUser> getLastRegistryUser(@Param("deviceId")String deviceId);

    /**
     * 根据设备ID 和 渠道ID 查询用户信息
     */
    YtDyzUser getByDeviceAndDitch(@Param("deviceId") String deviceId,@Param("ditchId")Long ditchId);

    String getPlatformByDeviceId(@Param("deviceId")String deviceId);

    void updateTotal(@Param("userId") String userId, @Param("videoCount") int videoCount, @Param("revenue") BigDecimal revenue);

    /**
     * 通过设备ID查询关联用户
     * @param deviceIds
     * @return
     */
    List<YtDyzUser> selectUserByDeviceIds(@Param("deviceIds") List<String> deviceIds);
}
