using System;
using System.Data;
using System.Data.SqlClient;
using System.Web;
using System.IO;
using System.Collections;
using System.Text.RegularExpressions;
using System.Text;

namespace UUN
{
    public class 编译扩展_Singer_Album : 编译扩展接口
    {
        private SqlConnection 连接;
        private HttpContext HC;
        private 编译器 编译器;

        public 编译扩展_Singer_Album(SqlConnection 连接, HttpContext HC, 编译器 编译器)
        {
            this.连接 = 连接;
            this.HC = HC;
            this.编译器 = 编译器;
        }

        private String 查询字段 = "[ID],[歌手/乐队名称]";
        private String 时间格式 = "yyyy-MM-dd HH:mm:ss";
        private int 一页显示记录数;
        private void 增加查询字段(String 字段名称)
        {
            String[] 字段数组 = 字段名称.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 0; i < 字段数组.Length; i++)
                if (查询字段.IndexOf("[" + 字段数组[i] + "]") == -1)
                    查询字段 += ",[" + 字段数组[i] + "]";
        }

        public string 开始执行代码()
        {
            编译器.方法库 += @"	private new int ID;
	private String 歌手名称;
	private int 排序;
	private String 查询字段;
	private String 时间格式;
	private Hashtable 歌手;
	private String 当前页面=@""" + 编译器.文件名称.Replace("\"", "\"\"") + @""";

	private int 当前页;
	private int 总页数;
	private int 总记录数;
	private int 一页显示记录数;

	private String 跳页表单项;
	private String _3G跳页表单项;
	private String 查询条件="""";
	private void 生成歌手()
	{
		SqlCommand 语句=new SqlCommand(""SELECT ""+查询字段+"" FROM [""+程序.数据表前缀+""内容_音乐_歌手] WHERE ""+(ID!=0?""[ID]=@ID"":""[歌手/乐队名称]=@歌手名称""),访问.连接);
		if(ID!=0)
			语句.Parameters.Add(""@ID"",SqlDbType.Int).Value=ID;
		else
			语句.Parameters.Add(""@歌手名称"",SqlDbType.NVarChar).Value=歌手名称;

		歌手=常用.SQL_获取(语句);
		if(歌手==null)
			throw new Exception(""歌手不存在"");

		if(ID==0)
			ID=Convert.ToInt32(歌手[""ID""]);
		else
			歌手名称=Convert.ToString(歌手[""歌手/乐队名称""]);
	}
	private String 列表跳页(int 页码)
	{
		return Server.HtmlEncode(常用.处理地址(当前页面+""?ID=""+ID+""&order=""+排序+""&page=""+页码,访问.用户[""标识""].ToString()));
	}
	private String 生成余下全部地址()
	{
		return """";
	}
";
            String 返回值 = "";
            返回值 += @"
		ID=Convert.ToInt32(Request.QueryString[""ID""]);
		歌手名称=Request.QueryString[""g""];
		一页显示记录数=获取一页显示记录数();
		查询字段=获取查询字段();
		时间格式=获取时间格式();
		生成歌手();
		跳页表单项=""<postfield name=\""ID\"" value=\""""+
			ID+
			""\"" />""+
			""<postfield name=\""order\"" value=\""""+排序+""\"" />""+
			""<postfield name=\""""+程序.设置[""标识名称""]+""\"" value=\""""+
			访问.用户[""标识""]+""\"" />"";
		_3G跳页表单项=""<input type=\""hidden\"" name=\""ID\"" value=\""""+
			ID+
			""\"" />""+
			""<input type=\""hidden\"" name=\""order\"" value=\""""+排序+""\"" />""+
			""<input type=\""hidden\"" name=\""""+程序.设置[""标识名称""]+""\"" value=\""""+
			访问.用户[""标识""]+""\"" />"";
";
            返回值 += 生成专辑列表条件(true, "");
            返回值 += "\t\t当前页=Convert.ToInt32(Request.QueryString[\"page\"]);\r\n";
            返回值 += "\t\t总记录数=Convert.ToInt32(数量语句.ExecuteScalar());\r\n";
            返回值 += "\t\t总页数=常用.计算总页数(总记录数,一页显示记录数);\r\n";
            返回值 += "\t\t当前页=常用.计算当前页(总页数,当前页);\r\n";

            return 返回值;
        }

        public string 编译公共标签(string 代码)
        {
            switch (代码)
            {
                case "ID":
                    return @"
		返回值.Append(ID);
";
                case "歌手/乐队名称":
                    return @"
		返回值.Append(Server.HtmlEncode(歌手名称));
";
                case "歌手图片":
                    增加查询字段("歌手图片");
                    return @"
		返回值.Append(""<img ""+常用.获取图片宽度高度(""歌手"")+"" src=\""""+歌手[""歌手图片""]+""\"" alt=\""图片\"" />"");
";
                case "歌手地区":
                    增加查询字段("歌手地区");
                    return @"
		返回值.Append(Server.HtmlEncode(歌手[""歌手地区""].ToString()));
";
                case "歌手类型":
                    增加查询字段("歌手类型");
                    return @"
		返回值.Append(Server.HtmlEncode(歌手[""歌手类型""].ToString()));
";
                case "歌手简介":
                    增加查询字段("歌手简介");
                    return @"
		返回值.Append(常用.UBB转换(Server.HtmlEncode(歌手[""歌手简介""].ToString()),访问.用户));
";
                case "创建时间":
                    增加查询字段("创建时间");
                    return @"
		返回值.Append(Convert.ToDateTime(歌手[""创建时间""]).ToString(时间格式));
";
                case "歌手地址":
                    return @"
		返回值.Append(Server.HtmlEncode(常用.处理地址(""" + (编译器.是否WML网页 ? "" : "3G_") + @"Singer.aspx?ID=""+ID,访问.用户[""标识""].ToString())));
";
                case "当前页":
                    return @"
		返回值.Append(当前页);
";
                case "总页数":
                    return @"
		返回值.Append(总页数);
";
                case "总记录数":
                    return @"
		返回值.Append(总记录数);
";
                default:
                    return "";
            }
        }

        public string 编译模板方法(string 方法名称, string[] 属性数组)
        {
            switch (方法名称)
            {
                case "上个歌手":
                    return 编译模板方法_上下歌手(属性数组[0],
                        属性数组[1],
                        属性数组[2], true);
                case "下个歌手":
                    return 编译模板方法_上下歌手(属性数组[0],
                        属性数组[1],
                        属性数组[2], false);
                case "格式设置":
                    return 编译模板方法_格式设置(属性数组[0]);
                case "_专辑列表":
                    return 编译模板方法_专辑列表(属性数组[0],
                        属性数组[1],
                        属性数组[2],
                        属性数组[3]);
                case "列表分页":
                    return 列表分页(Convert.ToInt32(属性数组[0]),
                        属性数组[1]);
                case "分页设置":
                    return 分页设置(Convert.ToInt32(属性数组[0]));
                default:
                    return "";
            }
        }


        private String 生成专辑列表条件(bool 是否数量, String 查询字段)
        {
            String 返回值 = "";
            String 语句名称 = 是否数量 ? "数量语句" : "语句";
            if (是否数量)
                返回值 += "\t\t查询条件+=\" WHERE [专辑歌手]=@专辑歌手\";\r\n";
            返回值 += "\t\tString " + 语句名称 + "SQL=\"SELECT " + (是否数量 ? "COUNT(ID)" : 查询字段) + " FROM [\"+程序.数据表前缀+\"内容_音乐_专辑]\"+查询条件;\r\n";

            if (!是否数量)
            {
                返回值 += "\t\t" + 语句名称 + "SQL+=\" ORDER BY \";\r\n";
                返回值 += "\t\tswitch(排序)\r\n";
                返回值 += "\t\t{\r\n";
                返回值 += "\t\t\tcase 0:\r\n";
                返回值 += "\t\t\t\t" + 语句名称 + "SQL+=\"[创建时间]\";\r\n";
                返回值 += "\t\t\t\tbreak;\r\n";
                返回值 += "\t\t\tdefault:\r\n";
                返回值 += "\t\t\t\t" + 语句名称 + "SQL+=\"[创建时间] DESC\";\r\n";
                返回值 += "\t\t\t\tbreak;\r\n";
                返回值 += "\t\t}\r\n";
            }
            返回值 += "\t\tSqlCommand " + 语句名称 + "=new SqlCommand(" + 语句名称 + "SQL,访问.连接);\r\n";
            返回值 += "\t\t" + 语句名称 + ".Parameters.Add(\"@专辑歌手\",SqlDbType.NVarChar).Value=歌手名称;\r\n";
            return 返回值;
        }

        private String 生成查询结果列表(String 行代码)
        {
            String 返回值 = "";
            返回值 += "\t\tDataSet 数据=new DataSet();\r\n";
            返回值 += "\t\tSqlDataAdapter 填充=new SqlDataAdapter(语句);\r\n";
            返回值 += "\t\t填充.Fill(数据,(当前页-1)*一页显示记录数,一页显示记录数,\"表\");\r\n";
            返回值 += "\t\tfor(int i=0;i<数据.Tables[0].Rows.Count;i++)\r\n";
            返回值 += "\t\t{\r\n";
            返回值 += 行代码;
            返回值 += "\t\t}\r\n";
            返回值 += "\t\t}\r\n";
            return 返回值;
        }

        private String 编译模板方法_专辑列表(String 空记录代码, String 格式, String 交替格式, String 时间格式)
        {
            String 随机值 = 常用.随机字符(8);

            Hashtable 必须字段 = new Hashtable();
            必须字段.Add("序号", "");
            必须字段.Add("专辑地址", "ID");
            必须字段.Add("图片内容", "专辑封面");
            Hashtable 字段代码 = new Hashtable();
            字段代码.Add("序号", "(当前页-1)*一页显示记录数+i+1");
            字段代码.Add("专辑地址", @"Server.HtmlEncode(常用.处理地址(程序.安装位置+""" + (编译器.是否WML网页 ? "" : "3G_") + @"Album.aspx?ID=""+行[""ID""],访问.用户[""标识""].ToString()))");
            字段代码.Add("图片内容", "行[\"专辑封面\"].ToString==\"\"?\"\":\"<img src=\\\"\"+行[\"专辑封面\"]+\"\\\" alt=\\\"图片\\\"\"+常用.获取图片宽度高度(\"专辑\")+\" />\"");
            字段代码.Add("专辑名称", @"Server.HtmlEncode(行[""专辑名称""].ToString())");
            字段代码.Add("专辑歌手", @"Server.HtmlEncode(行[""专辑歌手""].ToString())");
            字段代码.Add("专辑简介", @"Server.HtmlEncode(常用.截取字符串(行[""专辑简介""].ToString(),100))");
            字段代码.Add("创建时间", @"Convert.ToDateTime(行[""创建时间""]).ToString(""" + 时间格式 + "\")");

            String 查询字段, 行代码;
            查询字段 = 编译器.生成查询字段(格式, 交替格式, 必须字段, 字段代码, out 行代码);

            编译器.方法库 += "\tprivate void 专辑列表" + 随机值 + "()\r\n";
            编译器.方法库 += "\t{\r\n";
            编译器.方法库 += "\t\tif(总记录数<1)\r\n";
            编译器.方法库 += "\t\t\t返回值.Append(@\"" + 空记录代码.Replace("\"", "\"\"") + "\");\r\n";
            编译器.方法库 += 生成专辑列表条件(false, 查询字段);
            编译器.方法库 += 生成查询结果列表(行代码);

            return "\t\t专辑列表" + 随机值 + "();\r\n";
        }
        private String 列表分页(int ID, String 无分页代码)
        {
            return 编译器.编译内容分页(
                "Content",
                "Page", ID, 无分页代码);
        }

        private String 分页设置(int 一页显示记录数)
        {
            this.一页显示记录数 = 一页显示记录数;
            return "";
        }

        private String 编译模板方法_上下歌手(String 格式, String 时间格式, String 空记录代码, bool 上_下)
        {
            String 随机值 = 常用.随机字符(8);

            Hashtable 必须字段 = new Hashtable();
            必须字段.Add("序号", "");
            必须字段.Add("图片内容", "歌手图片");
            必须字段.Add("歌手地址", "ID");
            Hashtable 字段代码 = new Hashtable();
            字段代码.Add("序号", "i+1");
            字段代码.Add("图片内容", "\"<img src=\\\"\"+行[\"歌手图片\"]+\"\\\" alt=\\\"图片\\\"\"+常用.获取图片宽度高度(\"歌手\")+\" />\"");
            字段代码.Add("歌手地址", @"Server.HtmlEncode(常用.处理地址(程序.安装位置+""" + (编译器.是否WML网页 ? "" : "3G_") + @"Singer.aspx?ID=""+行[""ID""],访问.用户[""标识""].ToString()))");
            字段代码.Add("歌手/乐队名称", @"Server.HtmlEncode(行[""歌手/乐队名称""].ToString())");
            字段代码.Add("歌手简介", @"Server.HtmlEncode(常用.截取字符串(行[""歌手简介""].ToString(),100))");
            字段代码.Add("创建时间", @"Convert.ToDateTime(行[""创建时间""]).ToString(""" + 时间格式 + "\")");

            String 查询字段, 行代码;
            查询字段 = 编译器.生成查询字段(格式, "", 必须字段, 字段代码, out 行代码);
            编译器.方法库 += @"	private void 上下歌手" + 随机值 + @"()
	{
		String SQL=""SELECT " + 查询字段 + @" FROM [""+程序.数据表前缀+""内容_音乐_歌手]"";
";
            if (上_下)
                编译器.方法库 += "\t\tSQL+=\" WHERE [ID]<\"+ID+\" ORDER BY [ID] DESC\";\r\n";
            else
                编译器.方法库 += "\t\tSQL+=\" WHERE [ID]>\"+ID+\" ORDER BY [ID]\";\r\n";
            编译器.方法库 += @"		SqlCommand 语句=new SqlCommand(SQL,访问.连接);
		SqlDataReader 行=语句.ExecuteReader();
		if(行.Read())
		{
";
            编译器.方法库 += 编译器.生成代码项(字段代码, 格式);
            编译器.方法库 += @"
		}
		else
		{
			返回值.Append(@""" + 空记录代码.Replace("\"", "\"\"") + @""");
		}
		行.Close();
	}
";
            String 返回值 = "";
            返回值 += "\t\t上下歌手" + 随机值 + "();\r\n";
            return 返回值;
        }

        private String 编译模板方法_格式设置(String 时间格式)
        {
            this.时间格式 = 时间格式;
            return "";
        }

        public string 结束执行代码()
        {
            编译器.方法库 += @"
	private String 获取时间格式()
	{
";
            if (时间格式 == null || 时间格式 == "")
                编译器.方法库 += "\t\treturn null;\r\n";
            else
                编译器.方法库 += "\t\treturn @\"" + 时间格式.Replace("\"", "\"\"") + "\";\r\n";
            编译器.方法库 += @"
	}
";
            编译器.方法库 += @"
	private String 获取查询字段()
	{
";
            if (查询字段 == null || 查询字段 == "")
                编译器.方法库 += "\t\treturn null;\r\n";
            else
                编译器.方法库 += "\t\treturn @\"" + 查询字段.Replace("\"", "\"\"") + "\";\r\n";
            编译器.方法库 += @"
	}
";
            编译器.方法库 += @"
	private int 获取一页显示记录数()
	{
";
            if (一页显示记录数 == 0)
                编译器.方法库 += "\t\treturn 访问.获取一页显示记录数();\r\n";
            else
                编译器.方法库 += "\t\treturn " + 一页显示记录数 + ";\r\n";
            编译器.方法库 += @"
	}
";
            return "";
        }
    }
}