﻿/**********************************************************************************
 * 程序说明：     评论类(数据访问层)
 * 创建日期：     2009.6.13
 * 修改日期：     2012.02.15
 * 程序制作：     agui
 * 联系方式：     mailto:354990393@qq.com  
 * 版权申明：     http://www.plugnet.cn/copyright.html
 * ********************************************************************************/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.Common;
using System.Security.Cryptography;

using PlugNT.Database;
using PlugNT.Database.Common.Simple;
using PlugNT.Cms.Custom;
using PlugNT.Cms.Model;

namespace PlugNT.Cms.DAL
{
    public class Comment
    {

        internal static string currTableName = SiteConfig.TablePrefix + "comment";



        #region 获取一个实体



        /// <summary>
        /// 根据id获取模型
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public CommentInfo GetCommentInfo(int id)
        {
            bool isRead = false;
            string[] strArr = new string[17];

            IDataReader dr = GetReader(1, "[id], sys_model_id, channel_id, article_id, target_id, [username], [ip], [locked], [title], [content], [reply], addtime, reptime, address, tip, [layer], [score]", " and id=" + id);
            if (dr != null)
            {
                if (dr.Read())
                {
                    isRead = true;
                    strArr[0] = dr["id"].ToString();
                    strArr[1] = dr["sys_model_id"].ToString();
                    strArr[2] = dr["channel_id"].ToString();
                    strArr[3] = dr["article_id"].ToString();
                    strArr[4] = dr["target_id"].ToString();
                    strArr[5] = dr["username"].ToString();
                    strArr[6] = dr["ip"].ToString();
                    strArr[7] = dr["locked"].ToString();
                    strArr[8] = dr["title"].ToString();
                    strArr[9] = dr["content"].ToString();
                    strArr[10] = dr["reply"].ToString();
                    strArr[11] = dr["addtime"].ToString();
                    strArr[12] = dr["address"].ToString();
                    strArr[13] = dr["tip"].ToString();
                    strArr[14] = dr["layer"].ToString();
                    strArr[15] = dr["score"].ToString();
                    strArr[16] = dr["reptime"].ToString();
                }
                dr.Close();
            }
            if (isRead)
            {
                CommentInfo model = new CommentInfo();
                if (strArr[0] != "")
                {
                    model.id = int.Parse(strArr[0]);
                }
                if (strArr[1] != "")
                {
                    model.sys_model_id = int.Parse(strArr[1]);
                }
                if (strArr[2] != "")
                {
                    model.channel_id = int.Parse(strArr[2]);
                }
                if (strArr[3] != "")
                {
                    model.article_id = int.Parse(strArr[3]);
                }
                if (strArr[4] != "")
                {
                    model.target_id = int.Parse(strArr[4]);
                }
                model.username = strArr[5];
                model.ip = strArr[6];
                if (strArr[7] != "")
                {
                    model.locked = strArr[7] == "1";
                }
                model.title = strArr[8];
                model.content = strArr[9];
                model.reply = strArr[10];
                if (strArr[11] != "")
                {
                    model.addtime = DateTime.Parse(strArr[11]);
                }
                model.address = strArr[12];
                if (strArr[13] != "")
                {
                    model.tip = int.Parse(strArr[13]);
                }
                if (strArr[14] != "")
                {
                    model.layer = int.Parse(strArr[14]);
                }
                if (strArr[15] != "")
                {
                    model.score = int.Parse(strArr[15]);
                }
                if (strArr[16] != "")
                {
                    model.reptime = DateTime.Parse(strArr[16]);
                }
                return model;
            }
            else
            {
                return null;
            }
        }



        /// <summary>
        /// 获取文章id
        /// </summary>
        /// <param name="sysModelId"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        private int GetArticleId(int id)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("select top 1 article_id from " + currTableName);
            strSql.Append(" where id=" + id.ToString());
            object obj = DbHelper.GetSingle(strSql.ToString());
            return (obj != null) ? int.Parse(obj.ToString()) : 0;
        }

        #endregion

        #region 添加，修改，删除操作

        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool Add(CommentInfo model)
        {

            StringBuilder strSql = new StringBuilder();
            strSql.Append("insert into ");
            strSql.Append(currTableName);
            strSql.Append("(sys_model_id,channel_id,article_id,target_id,[username],ip,locked,[title],[content],reply,addtime,reptime,address,tip,layer,score)");
            strSql.Append(" values (");
            strSql.Append("@sys_model_id,@channel_id,@article_id,@target_id,@username,@ip,@locked,@title,@content,@reply,@addtime,@reptime,@address,@tip,@layer,@score)");
            DbParameter[] parameters = {
                 ParamHelper.MakeParam("@sys_model_id",model.sys_model_id),
                 ParamHelper.MakeParam("@channel_id",model.channel_id),
                 ParamHelper.MakeParam("@article_id",model.article_id),
                 ParamHelper.MakeParam("@target_id",model.target_id),
                 ParamHelper.MakeParam("@username",model.username),
                 ParamHelper.MakeParam("@ip",model.ip),
                 ParamHelper.MakeParam("@locked",model.locked?1:0),
                 ParamHelper.MakeParam("@title",model.title),
                 ParamHelper.MakeParam("@content",model.content),
                 ParamHelper.MakeParam("@reply",model.reply),
                 ParamHelper.MakeParam("@addtime",model.addtime.ToString()),
                 ParamHelper.MakeParam("@reptime",model.reptime.ToString()),
                 ParamHelper.MakeParam("@address",model.address),
                 ParamHelper.MakeParam("@tip",model.tip),
                 ParamHelper.MakeParam("@layer",model.layer),
                 ParamHelper.MakeParam("@score",model.score)
             };
            return (DbHelper.ExecuteSql(strSql.ToString(), parameters) > 0) ? true : false;


        }

        /// <summary>
        /// 更新内容
        /// </summary>
        /// <param name="id"></param>
        /// <param name="layer"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        public bool UpdateContent(int id,int layer,string content)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("update ");
            strSql.Append(currTableName);
            strSql.Append(" set ");
            strSql.Append("[content]=@content,");
            strSql.Append("[layer]=@layer");
            strSql.Append(" where [id]=@id ");
            DbParameter[] parameters = {
                 ParamHelper.MakeParam("@content",content),
                 ParamHelper.MakeParam("@layer",layer),
                 ParamHelper.MakeParam("@id",id)
             };
            return (DbHelper.ExecuteSql(strSql.ToString(), parameters) > 0) ? true : false;
        }

        /// <summary>
        /// 更新回帖
        /// </summary>
        /// <param name="id"></param>
        /// <param name="reply"></param>
        /// <returns></returns>
        public bool UpdateReply(int id,  string reply)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("update ");
            strSql.Append(currTableName);
            strSql.Append(" set ");
            strSql.Append("[reply]=@reply,");
            strSql.Append("[reptime]=@reptime");
            strSql.Append(" where [id]=@id ");
            DbParameter[] parameters = {
                 ParamHelper.MakeParam("@reply",reply),
                 ParamHelper.MakeParam("@reptime",DateTime.Now.ToString()),
                 ParamHelper.MakeParam("@id",id)
             };
            return (DbHelper.ExecuteSql(strSql.ToString(), parameters) > 0) ? true : false;
        }

        /// <summary>
        /// 更新顶贴
        /// </summary>
        /// <param name="id"></param>
        /// <param name="tip"></param>
        /// <returns></returns>
        public bool UpdateTip(int id,int tip)
        {
            
            StringBuilder strSql = new StringBuilder();

            strSql.Append("update " + currTableName + " set ");
            strSql.Append("tip=" + tip.ToString());
            strSql.Append(" where id=" + id.ToString());

            return (DbHelper.ExecuteSql(strSql.ToString()) > 0) ? true : false;
        }

        /// <summary>
        /// 更新锁定
        /// </summary>
        /// <param name="id"></param>
        /// <param name="locked"></param>
        /// <returns></returns>
        public bool UpdateLocked(int id, bool locked)
        {
            
            StringBuilder strSql = new StringBuilder();

            strSql.Append("update " + currTableName + " set ");
            strSql.Append("locked=" + (locked ? "1" : "0"));
            strSql.Append(" where id=" + id.ToString());

            return (DbHelper.ExecuteSql(strSql.ToString()) > 0) ? true : false;
        }

        /// <summary>
        /// 添加顶贴
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public bool AddTip(int id)
        {
            
            StringBuilder strSql = new StringBuilder();

            strSql.Append("update " + currTableName + " set ");
            strSql.Append("tip=tip+1");
            strSql.Append(" where id=" + id.ToString());

            return (DbHelper.ExecuteSql(strSql.ToString()) > 0) ? true : false;
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public bool Delete(int id)
        {

            StringBuilder strSql = new StringBuilder();
            strSql.Append("delete from " + currTableName);
            strSql.Append(" where id=" + id.ToString());

            return (DbHelper.ExecuteSql(strSql.ToString()) > 0) ? true : false;
        }

        #endregion


        #region 获取列表

        /// <summary>
        /// 得到IDataReader
        /// </summary>
        /// <param name="topCount">-1表示全部</param>
        /// <param name="colNames"></param>
        /// <param name="andWhere"></param>
        /// <returns></returns>
        private IDataReader GetReader(int topCount, string colNames, string andWhere)
        {
            string sql = "select " + (topCount == -1 ? "" : "top " + topCount) + " " + colNames + " from " + currTableName + " where 1=1 " + andWhere;
            return DbHelper.ExecuteReader(sql);
        }

        /// <summary>
        /// 获取ID列表
        /// </summary>
        /// <param name="sysModelId"></param>
        /// <param name="andWhere"></param>
        /// <returns></returns>
        public DataTable GetIdList(int sysModelId, string andWhere)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("select [id] from [" + currTableName + "] where sys_model_id= " + sysModelId);
            strSql.Append(andWhere);

            return DbHelper.GetDataTable(strSql.ToString());
        }


        /// <summary>
        /// 获取列表
        /// </summary>
        /// <param name="andWhere"></param>
        /// <returns></returns>
        public DataTable GetList(int sysModelId, string andWhere)
        {
            
            StringBuilder strSql = new StringBuilder();
            strSql.Append("select * from  [" + currTableName + "] where sys_model_id= "+ sysModelId);
            strSql.Append(andWhere);
            return DbHelper.GetDataTable(strSql.ToString());
        }

        /// <summary>
        /// 获取列表
        /// </summary>
        /// <param name="sysModelId"></param>
        /// <param name="topCount"></param>
        /// <param name="andWhere"></param>
        /// <returns></returns>
        public DataTable GetList(int sysModelId, int topCount, string andWhere)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("select " + (topCount > 0 ? "top " + topCount : "") + " * from  [" + currTableName + "] where sys_model_id= " + sysModelId);
            strSql.Append(andWhere);
            return DbHelper.GetDataTable(strSql.ToString());
        }

        /// <summary>
        /// 获取列表
        /// </summary>
        /// <param name="sysModelId"></param>
        /// <param name="topCount"></param>
        /// <param name="userColumns"></param>
        /// <param name="andWhere"></param>
        /// <returns></returns>
        public DataTable GetList(int sysModelId, int topCount, string userColumns, string andWhere)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("select " + (topCount > 0 ? "top " + topCount : "") + " a.*,b." +
                userColumns.Replace(",",",b.") + " from  [" + currTableName + "] as a left join "+
                SiteConfig.UsersTableName + " as b on a.username=b." + SiteConfig.GetUserField("username") + " where a.sys_model_id= " + sysModelId);
            strSql.Append(andWhere.Replace("and ", "and a."));
            DataTable dt = DbHelper.GetDataTable(strSql.ToString());
            if (dt.Columns.Contains("a.username") && !dt.Columns.Contains("username"))
            {
                dt.Columns["a.username"].ColumnName = "username";
            }
            return dt;
        }

        /// <summary>
        /// 获取列表
        /// </summary>
        /// <param name="sysModelId"></param>
        /// <param name="topCount"></param>
        /// <param name="userColumns"></param>
        /// <param name="articleColumns"></param>
        /// <param name="andWhere"></param>
        /// <returns></returns>
        public DataTable GetList(int sysModelId, int topCount, string userColumns,string articleColumns, string andWhere)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("select " + (topCount > 0 ? "top " + topCount : "") + " a.*,b." +
                userColumns.Replace(",", ",b.") + ",c." + articleColumns.Replace(",", ",c.") + " from  (" + currTableName + " as a left join " +
                SiteConfig.UsersTableName + " as b on a.username=b." + SiteConfig.GetUserField("username") + ")" +
                " left join " + Article.currTableName + sysModelId + " as c on a.article_id=c.id where a.sys_model_id= " + sysModelId);
            strSql.Append(andWhere.Replace("and ", "and a."));
            DataTable dt = DbHelper.GetDataTable(strSql.ToString());
            if (dt.Columns.Contains("a.username") && !dt.Columns.Contains("username"))
            {
                dt.Columns["a.username"].ColumnName = "username";
            }
            return dt;
        }


        /// <summary>
       /// 获取列表
        /// </summary>
        /// <param name="sysModelId"></param>
        /// <param name="pageSize"></param>
        /// <param name="currPage"></param>
        /// <param name="andWhere"></param>
        /// <param name="isReverse"></param>
        /// <returns></returns>
        public DataTable GetList(int sysModelId, int pageSize, int currPage, string andWhere, bool isReverse)
        {
            string sql = "";
            if (isReverse)
            {
                sql = SqlHelper.GetPagingString(pageSize, currPage, "[" + currTableName + "]", "id", " and sys_model_id=" + sysModelId + andWhere);
            }
            else
            {
                sql = SqlHelper.GetPagingString(pageSize, currPage, "[" + currTableName + "]", "id", " and sys_model_id=" + sysModelId + andWhere);
            }

            return DbHelper.GetDataTable(sql);
        }

        /// <summary>
        /// 获取列表
        /// </summary>
        /// <param name="sysModelId"></param>
        /// <param name="pageSize"></param>
        /// <param name="currPage"></param>
        /// <param name="columns"></param>
        /// <param name="andWhere"></param>
        /// <param name="isReverse"></param>
        /// <param name="joininfo"></param>
        /// <returns></returns>
        public DataTable GetList(int sysModelId, int pageSize, int currPage, string columns, string andWhere, bool isReverse, LeftJoinInfo joininfo)
        {
            //PlugNT.Database.LeftJoinInfo joininfo1 = new PlugNT.Database.LeftJoinInfo("cms_comment", "username,ip", "id", "articleid");
            //PlugNT.Database.LeftJoinInfo joininfo = new PlugNT.Database.LeftJoinInfo("cms_weiqu_pics", "*", "id", "article_id", joininfo1);
            //string andWhere = new List<string>();
            //andWhere.Add("weiqu_enable=1");
            //string sql = PlugNT.Database.SqlHelper.GetPagingString(3, 1, "cms_article", "id", "*",andWhere, joininfo);

            string sql = "";
            if (isReverse)
            {
                sql = SqlHelper.GetPagingString(pageSize, currPage, currTableName, "id", columns, " and sys_model_id=" + sysModelId + " " + andWhere, joininfo);
            }
            else
            {
                sql = SqlHelper.GetPagingString(pageSize, currPage, currTableName, "id", columns, " and sys_model_id=" + sysModelId + " " + andWhere, joininfo);
            }

            DataTable dt = DbHelper.GetDataTable(sql);
            if (dt.Columns.Contains("a.id") && !dt.Columns.Contains("id"))
            {
                dt.Columns["a.id"].ColumnName = "id";
            }
            return dt;
        }

        #endregion

        ///// <summary>
        ///// 获取列表key->文章ID,value->文章数
        ///// </summary>
        ///// <param name="idName"></param>
        ///// <param name="reTable"></param>
        ///// <param name="currPostfix"></param>
        ///// <returns></returns>
        //public IDictionary GetCountDictionary(int sysModelId,string idName, DataTable reTable)
        //{
        //    IDictionary dics = new Dictionary<string, string>();
        //    StringBuilder sb = new StringBuilder();
        //    bool flag = false;
        //    if (reTable.Rows.Count > 0)
        //    {
        //        foreach (DataRow dr in reTable.Rows)
        //        {
        //            if (flag)
        //            {
        //                sb.Append(",");
        //            }
        //            flag = true;
        //            sb.Append(dr[idName].ToString());
        //        }
        //        string andWhere = " and [locked]=0";
        //        string sql = "select count(article_id) as tcount,article_id from [" + currTableName +
        //            "] where sys_model_id= "+ sysModelId + andWhere + " and article_id in(" + sb.ToString() + ")  group by article_id";
        //        DataTable dt = DbHelper.GetDataTable(sql);
        //        foreach (DataRow dr in dt.Rows)
        //        {
        //            dics.Add(dr["article_id"].ToString(), dr["tcount"].ToString());
        //        }
        //    }
        //    return dics;
        //}

        /// <summary>
        /// 获取总数
        /// </summary>
        /// <param name="sysModelId"></param>
        /// <param name="andWhere"></param>
        /// <returns></returns>
        public int GetCount(int sysModelId, string andWhere)
        {
            string sql = "select count(1) from [" + currTableName + "] where sys_model_id= " + sysModelId + " " + andWhere;
            
            object obj = DbHelper.GetSingle(sql);
            return obj == null ? -1 : int.Parse(obj.ToString());
        }

        /// <summary>
        /// 获取评分
        /// </summary>
        /// <param name="sysModelId"></param>
        /// <param name="andWhere"></param>
        /// <returns></returns>
        public int GetScore(int sysModelId, string andWhere)
        {
            string sql = "select sum(score) from [" + currTableName + "] where sys_model_id= " + sysModelId + " " + andWhere;
            object obj = DbHelper.GetSingle(sql);
            return obj == null ? -1 : int.Parse(obj.ToString());
        }


        /// <summary>
        /// 获取顶贴总数
        /// </summary>
        /// <param name="sysModelId"></param>
        /// <param name="andWhere"></param>
        /// <returns></returns>
        public int GetTipCount(int sysModelId, string andWhere)
        {
            string sql = "select tip from [" + currTableName + "] where sys_model_id= " + sysModelId + " " + andWhere;
            object obj= DbHelper.GetSingle(sql);
            return obj == null ? -1 : int.Parse(obj.ToString());
        }


    }
}
