using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ObjectModel.Backend
{
    /// <summary>
    /// 推广奖励对象
    /// </summary>
    public class RewardModel
    {
        /// <summary>
        /// id编号 主键 自增
        /// </summary>
        public int id;

        /// <summary>
        /// 玩家id或者后台Id
        /// </summary>
        public int userid;

        /// <summary>
        /// 变化的数值，按理说只有加，没有减
        /// </summary>
        public int num;

        /// <summary>
        /// 奖励类型 1首次游戏 2参赛 3充值
        /// </summary>
        public Byte type;

        /// <summary>
        /// 场景ID 1娱乐官 2休闲馆 3竞赛馆 4充值
        /// </summary>
        public Byte senceId;

        /// <summary>
        /// 是否领取0未领取 1领取过。
        /// 因为红包券是存在redis里面。充值逻辑在数据库里面。所以才会有这种设计
        /// 在查询玩家奖励列表的时候可以把为状态为0的奖励加到redis里面。并且修改状态。
        /// </summary>
        public byte lqstate;

        /// <summary>
        /// 产生时间
        /// </summary>
        public DateTime createDate;

        /// <summary>
        /// 产生数据的人
        /// </summary>
        public int fromUser;

        /// <summary>
        /// 0红包 1参赛卷
        /// </summary>
        public int numlx;

        public RewardModel() { }

        public RewardModel(DataRow row)
        {
            this.id = (int)row["id"];
            this.userid = (int)row["userid"];
            this.fromUser = (int)row["fromUser"];
            this.num = (int)row["num"];
            this.numlx = (int)row["numlx"];
            this.type = (byte)row["type"];
            this.senceId = (byte)row["senceId"];
            this.lqstate = (byte)row["lqstate"];
            this.createDate = (DateTime)row["createDate"];
        }

        public RewardModel(int userid, int num, byte type, byte senceId, int _fromUser,int numlx)
        {
            this.userid = userid;
            this.num = num;
            this.type = type;
            this.senceId = senceId;
            this.fromUser = _fromUser;
            this.numlx = numlx;
        }

        /// <summary>
        /// 获取插入语句SQL
        /// </summary>
        /// <returns></returns>
        public string GetInsertSql()
        {
            if (!CheckData()) throw new ArgumentOutOfRangeException($"参数异常,userid:{userid} type:{type} senceId:{senceId}");
            return $"INSERT INTO [Rewards]([userid], [num], [type], [senceId],fromUser,numlx) VALUES ({userid}, {num}, {type},{senceId} ,{fromUser},{numlx})";
        }

        /// <summary>
        /// 校验数据
        /// </summary>
        /// <returns></returns>
        public bool CheckData()
        {
            return userid > 0 && type > 0 && senceId > 0 && num > 0;
        }
    }

    public class GetMyRewardsResponse : RewardModel
    {
        /// <summary>
        /// 玩家昵称
        /// </summary>
        public string NickName;

        /// <summary>
        /// 注册时间
        /// </summary>
        public DateTime RegTime;

        /// <summary>
        /// 最后登录时间
        /// </summary>
        public DateTime LastLoginTime;

        public GetMyRewardsResponse() { }

        public GetMyRewardsResponse(DataRow row) : base(row)
        {
            this.LastLoginTime = (DateTime)row["LastLoginTime"];
            this.RegTime = (DateTime)row["RegTime"];
            this.NickName = row["NickName"].ToString();
        }
    }

    /// <summary>
    /// 推广玩家信息
    /// </summary>
    public class Promoter
    {
        /// <summary>
        /// 玩家Id（编号）
        /// </summary>
        public int UserId;

        /// <summary>
        /// 昵称
        /// </summary>
        public string NickName;

        /// <summary>
        /// 推广人数
        /// </summary>
        public int RenCount;

        /// <summary>
        /// 推广奖励
        /// </summary>
        public int MoneyCount;

        public Promoter() { }

        public Promoter(DataRow row)
        {
            this.UserId = (int)row["userid"];
            this.RenCount = DBNull.Value != row["rencount"] ? (int)row["rencount"] : 0;
            this.MoneyCount = DBNull.Value != row["moneycount"] ? (int)row["moneycount"] : 0;
            this.NickName = row["NickName"].ToString();
        }
    }

    public class GroupByReward {
        /// <summary>
        /// 玩家userid（编号）
        /// </summary>
        public int UserId;

        /// <summary>
        /// 玩家昵称
        /// </summary>
        public string NickName;

        /// <summary>
        /// 产生的奖励值总和
        /// </summary>
        public int Money;

        public GroupByReward() { }

        public GroupByReward(DataRow row) {
            this.UserId = (int)row["UserID"];
            this.Money = (int)row["moneySum"];
            this.NickName = row["NickName"].ToString();
        }
    }
}
