package com.ytpm.lemonios.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 {

    /**
     * userId查询用户信息
     */
    YtDyzUser selectById(@Param("userId")String userId);

    /**
     * IOSId查询用户信息
     */
    YtDyzUser selectByIosId(@Param("iosId")String iosId);

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

    /**
     * openid查询用户信息
     */
    YtDyzUser getYtAppUserForIos(@Param("iosId")String iosId,@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") Integer appType);

    /**
     * 根据应用ID查询应用默认配置
     */
    YtAppDefaultConfig getConfigByAppId(@Param("appId") String appId);

    /**
     * 根据应用ID查询应用默认配置
     */
    WxDefaultConfig getByAppId(@Param("appId") String appId);

    /**
     * 根据应用ID查询应用默认配置
     */
    WxDefaultConfig getDefaultConfigByDitchId(@Param("ditchId") Long ditchId);

    /**
     * 获取最近一条默认配置
     */
    WxDefaultConfig getLastOne(@Param("appId") String appId);

    /**
     * 获取最近一条默认配置
     */
    WxDefaultConfig getLastDefaultConfig();

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

    /**
     * 根据IosId查询用户
     */
    List<YtDyzUser> queryByIosId(@Param("iosId")String iosId);

    /**
     * 根据设备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("sortBy") int sortBy,@Param("limit") int limit);

    /**
     * 查询用户排行榜数据
     */
    List<UserRankingListVO> getUserRanking(@Param("sortBy") int sortBy,@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);

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

    YtDyzUser getYtAppUserAndDitchNull(@Param("iosId") String iosId);

    List<YtDyzUser> queryByIps(@Param("appid") String appId, @Param("ips") List<String> ips);

    Long queryCountByIpTime(@Param("lastLoginIp") String lastLoginIp, @Param("date") Date startTime);

    Long queryCountByIpRegion(@Param("cityList") List<String> cityList,@Param("date") Date startTime);

    Long countUserByLastLoginIpAndAppList(@Param("lastLoginIp") String lastLoginIp, @Param("appList") String appList,
                                          @Param("startTime") Date startTime);
}
