using System;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Collections;

namespace UUN
{
    public class 消息
    {
        public HttpContext HC;
        public SqlConnection 连接;
        public 消息(HttpContext HC, SqlConnection 连接)
        {
            this.HC = HC;
            this.连接 = 连接;
        }
        public void 发送消息(int 发送人ID, int 接收人ID, String 消息内容)
        {
            用户 用户 = new 用户(HC, 连接);
            发送消息(发送人ID,
                用户.获取昵称(发送人ID),
                接收人ID,
                用户.获取昵称(接收人ID),
                消息内容);
        }
        public void 发送消息(int 发送人ID, String 发送人昵称, int 接收人ID, String 消息内容)
        {
            用户 用户 = new 用户(HC, 连接);
            发送消息(发送人ID,
                发送人昵称,
                接收人ID,
                用户.获取昵称(接收人ID),
                消息内容);
        }
        public void 发送消息(int 发送人ID, int 接收人ID, String 接收人昵称, String 消息内容)
        {
            用户 用户 = new 用户(HC, 连接);
            发送消息(发送人ID,
                用户.获取昵称(发送人ID),
                接收人ID,
                接收人昵称,
                消息内容);
        }
        public void 发送消息(int 发送人ID, String 发送人昵称, int 接收人ID, String 接收人昵称, String 消息内容)
        {
            int ZGID = 常用.SQL_最高ID(连接, 程序.数据表前缀+"社区_消息");

            SqlCommand 语句 = new SqlCommand("INSERT INTO ["+程序.数据表前缀+"社区_消息]([ID],[用户ID],[用户昵称],[目标用户ID],[目标用户昵称],[是否已读],[是否系统消息],[消息内容])" +
                "VALUES(" + ZGID + "," + 发送人ID + ",@用户昵称," + 接收人ID + ",@目标用户昵称,@是否已读,@是否系统消息,@消息内容)", 连接);
            语句.Parameters.Add("@用户昵称", SqlDbType.NVarChar).Value = 发送人昵称;
            语句.Parameters.Add("@目标用户昵称", SqlDbType.NVarChar).Value = 接收人昵称;
            语句.Parameters.Add("@是否已读", SqlDbType.Bit).Value = false;
            语句.Parameters.Add("@是否系统消息", SqlDbType.Bit).Value = false;
            语句.Parameters.Add("@消息内容", SqlDbType.NVarChar).Value = 消息内容;
            语句.ExecuteNonQuery();
            更新消息数量(接收人ID);
        }
        public void 发送系统消息(int 接收人ID, String 消息内容)
        {
            用户 用户 = new 用户(HC, 连接);
            发送系统消息(接收人ID,
                用户.获取昵称(接收人ID),
                消息内容);
        }
        public void 发送系统消息(int 接收人ID, String 接收人昵称, String 消息内容)
        {
            int ZGID = 常用.SQL_最高ID(连接, 程序.数据表前缀+"社区_消息");

            SqlCommand 语句 = new SqlCommand("INSERT INTO [" + 程序.数据表前缀 + "社区_消息]([ID],[用户ID],[用户昵称],[目标用户ID],[目标用户昵称],[是否已读],[是否系统消息],[消息内容])" +
                "VALUES(" + ZGID + ",0,@用户昵称," + 接收人ID + ",@目标用户昵称,@是否已读,@是否系统消息,@消息内容)", 连接);
            语句.Parameters.Add("@用户昵称", SqlDbType.NVarChar).Value = "系统";
            语句.Parameters.Add("@目标用户昵称", SqlDbType.NVarChar).Value = 接收人昵称;
            语句.Parameters.Add("@是否已读", SqlDbType.Bit).Value = false;
            语句.Parameters.Add("@是否系统消息", SqlDbType.Bit).Value = true;
            语句.Parameters.Add("@消息内容", SqlDbType.NVarChar).Value = 消息内容;
            语句.ExecuteNonQuery();
            更新消息数量(接收人ID);
        }
        private void 更新消息数量(int 用户ID)
        {
            int 消息数量;
            SqlCommand 语句 = new SqlCommand("SELECT COUNT(ID) FROM [" + 程序.数据表前缀 + "社区_消息] WHERE [目标用户ID]=" + 用户ID + " AND [是否已读]=0", 连接);
            消息数量 = Convert.ToInt32(语句.ExecuteScalar());

            语句 = new SqlCommand("UPDATE ["+程序.数据表前缀+"社区_用户_用户] SET [未读消息]=" + 消息数量 + " WHERE [ID]=" + 用户ID, 连接);
            语句.ExecuteNonQuery();
        }
        public void 发送消息(String 用户类型, int 用户ID, String 消息内容)
        {
            if (消息内容.Length<1 || 消息内容.Length>255)
                throw new Exception("消息内容的长度只能在1-255之间");
            SqlCommand 语句;
            SqlCommand 语句2;
            switch (用户类型)
            {
                case "所有会员":
                    语句 = new SqlCommand("SELECT [ID],[昵称] FROM [" + 程序.数据表前缀 + "社区_用户_用户] WHERE [用户类型]='会员'", 连接);
                    语句2 = new SqlCommand("SELECT COUNT(ID) FROM [" + 程序.数据表前缀 + "社区_用户_用户] WHERE [用户类型]='会员'", 连接);
                    break;
                case "在线会员":
                    语句 = new SqlCommand("SELECT [ID],[昵称] FROM [" + 程序.数据表前缀 + "社区_用户_用户] WHERE [用户类型]='会员' AND [最后访问时间]=@最后访问时间", 连接);
                    语句.Parameters.Add("@最后访问时间", SqlDbType.DateTime).Value = DateTime.Now - new TimeSpan(0, Convert.ToInt32(程序.设置["离线时间"]), 0);
                    语句2 = new SqlCommand("SELECT COUNT(ID) FROM [" + 程序.数据表前缀 + "社区_用户_用户] WHERE [用户类型]='会员' AND [最后访问时间]=@最后访问时间", 连接);
                    语句2.Parameters.Add("@最后访问时间", SqlDbType.DateTime).Value = DateTime.Now - new TimeSpan(0, Convert.ToInt32(程序.设置["离线时间"]), 0);
                    break;
                default:
                    语句 = new SqlCommand("SELECT [ID],[昵称] FROM [" + 程序.数据表前缀 + "社区_用户_用户] WHERE [用户类型]='会员' AND [ID]=" + 用户ID, 连接);
                    语句2 = new SqlCommand("SELECT COUNT(ID) FROM [" + 程序.数据表前缀 + "社区_用户_用户] WHERE [用户类型]='会员' AND [ID]=" + 用户ID, 连接);
                    break;
            }

            SqlDataAdapter 填充=new SqlDataAdapter(语句);
            DataSet 数据 = new DataSet();
            int 会员数量 = Convert.ToInt32(语句2.ExecuteScalar());
            int 分段数 = 会员数量 % 100 == 0 ? 会员数量 / 100 : 会员数量 / 100 + 1;
            for (int i = 0; i < 分段数; i++)
            {
                填充.Fill(数据, i * 100, 100, "用户");
                for (int i1 = 0; i1 < 数据.Tables[0].Rows.Count; i1++)
                {
                    DataRow 行 = 数据.Tables[0].Rows[i1];
                    发送系统消息(Convert.ToInt32(行["ID"]),
                        Convert.ToString(行["昵称"]),
                        消息内容);
                }
            }
        }
        /// <summary>
        /// 获取最新发来的一条消息
        /// </summary>
        /// <returns></returns>
        public String 弹出消息(Hashtable 用户)
        {
            if (Convert.ToInt32(用户["未读消息"]) > 0)
                return "";
            SqlCommand 语句 = new SqlCommand("SELECT [ID],[用户ID],[用户昵称],[是否系统消息],[消息内容],[发送时间] FROM [" + 程序.数据表前缀 + "社区_消息] WHERE [目标用户ID]=" + 用户["ID"] + " AND [是否已读]=@是否已读", 连接);
            语句.Parameters.Add("@是否已读", SqlDbType.Bit).Value = false;
            Hashtable 消息 = 常用.SQL_获取(语句);
            if (消息 == null)
                return "";
            语句 = new SqlCommand("UPDATE [" + 程序.数据表前缀 + "社区_消息] SET [是否已读]=@是否已读 WHERE [ID]=" + 消息["ID"], 连接);
            语句.Parameters.Add("@是否已读", SqlDbType.Bit).Value = true;
            语句.ExecuteNonQuery();
            更新消息数量(Convert.ToInt32(用户["ID"]));

            String 返回值;
            if (Convert.ToBoolean(消息["是否系统消息"]))
                返回值 = "系统消息";
            else
                返回值 = "<a href=\"" + HC.Server.HtmlEncode(常用.处理地址(程序.安装位置 + "Club/User.aspx?ID=" + 消息["用户ID"] + "&rurl=" +
                    HC.Server.UrlEncode(HC.Request.Url.ToString().Replace(用户["标识"].ToString(), "@sid@")), 用户["标识"].ToString())) +
                    "\">" + HC.Server.HtmlEncode(消息["用户昵称"].ToString()) + "</a>";
            返回值 += ":" + HC.Server.HtmlEncode(消息["消息内容"].ToString());
            返回值 += "<a href=\"" + HC.Server.HtmlEncode(常用.处理地址(程序.安装位置 + "Club/Message_Send2.aspx?ID=" + 消息["用户ID"].ToString() + "&rurl=" +
                HC.Server.UrlEncode(HC.Request.Url.ToString().Replace(用户["标识"].ToString(), "@sid@")), 用户["标识"].ToString())) +
                "\">回复</a><br/>";
            return 返回值;
        }
    }
}