﻿<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.Odbc" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Text" %>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        // 1. 设置返回类型为标准的 XML，让搜索引擎识别
        Response.Clear();
        Response.ContentType = "text/xml";
        Response.ContentEncoding = Encoding.UTF8;

        // 2. 性能优化：缓存 24 小时，避免搜索引擎爬虫频繁拉取导致数据库压力过大
        Response.Cache.SetExpires(DateTime.Now.AddHours(24));
        Response.Cache.SetCacheability(HttpCacheability.Public);
        Response.Cache.SetValidUntilExpires(true);

        string baseUrl = "https://www.hangzhouhomes.com";
        string connStr = "Driver={MySQL ODBC 8.0 Unicode Driver};Server=47.104.190.184;Port=3306;Database=47_104_190_184;Uid=47_104_190_184;Pwd=k5jRwNXMzywrdB5h;CONNECTIONTIMEOUT=10;COMMANDTIMEOUT=30;charset=utf8mb4;";

        // 3. 开始构建 XML
        XmlTextWriter writer = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
        writer.Formatting = Formatting.Indented;

        writer.WriteStartDocument();
        writer.WriteStartElement("urlset");
        writer.WriteAttributeString("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");

        string today = DateTime.Now.ToString("yyyy-MM-dd");

        // --- A. 写入静态核心页面 ---
        string[] staticPages = {
            "/index.aspx",
            "/about.aspx",
            "/contact.aspx",
            "/listings.aspx",
            "/compounds.aspx",
            "/services.aspx",
            "/living.aspx",
            "/agents.aspx",
            "/testimonials.aspx",
            "/faq.aspx",
            "/privacy.aspx",
            "/terms.aspx",
            "/searchbymap.aspx"
        };

        foreach (string page in staticPages)
        {
            WriteUrl(writer, baseUrl + page + "?lang=en", today, "weekly", "1.0");
            WriteUrl(writer, baseUrl + page + "?lang=cn", today, "weekly", "1.0");
        }

        // --- B. 从数据库拉取动态页面 ---
        try
        {
            using (OdbcConnection conn = new OdbcConnection(connStr))
            {
                conn.Open();

                // 1. 动态获取所有在租房源
                using (OdbcCommand cmd = new OdbcCommand("SELECT id, update_time FROM tp_house WHERE status = 1", conn))
                using (OdbcDataReader rs = cmd.ExecuteReader())
                {
                    while (rs.Read())
                    {
                        string lastMod = GetIsoDate(rs["update_time"]);
                        WriteUrl(writer, baseUrl + "/detail.aspx?id=" + rs["id"] + "&lang=en", lastMod, "weekly", "0.9");
                        WriteUrl(writer, baseUrl + "/detail.aspx?id=" + rs["id"] + "&lang=cn", lastMod, "weekly", "0.9");
                    }
                }

                // 2. 动态获取所有热门楼盘
                using (OdbcCommand cmd = new OdbcCommand("SELECT id, create_time FROM tp_complex WHERE status = 1 AND delete_time = 0", conn))
                using (OdbcDataReader rs = cmd.ExecuteReader())
                {
                    while (rs.Read())
                    {
                        string lastMod = GetIsoDate(rs["create_time"]);
                        WriteUrl(writer, baseUrl + "/compound.aspx?id=" + rs["id"] + "&lang=en", lastMod, "monthly", "0.8");
                        WriteUrl(writer, baseUrl + "/compound.aspx?id=" + rs["id"] + "&lang=cn", lastMod, "monthly", "0.8");
                    }
                }

                // 3. 动态获取所有新闻和指南文章
                using (OdbcCommand cmd = new OdbcCommand("SELECT id, create_time FROM tp_article WHERE status = 1", conn))
                using (OdbcDataReader rs = cmd.ExecuteReader())
                {
                    while (rs.Read())
                    {
                        string lastMod = GetIsoDate(rs["create_time"]);
                        WriteUrl(writer, baseUrl + "/article.aspx?id=" + rs["id"] + "&lang=en", lastMod, "monthly", "0.7");
                        WriteUrl(writer, baseUrl + "/article.aspx?id=" + rs["id"] + "&lang=cn", lastMod, "monthly", "0.7");
                    }
                }

                // 4. 动态获取所有经纪人
                using (OdbcCommand cmd = new OdbcCommand("SELECT id FROM tp_agent WHERE delete_time = 0", conn))
                using (OdbcDataReader rs = cmd.ExecuteReader())
                {
                    while (rs.Read())
                    {
                        WriteUrl(writer, baseUrl + "/agent.aspx?id=" + rs["id"] + "&lang=en", today, "monthly", "0.6");
                        WriteUrl(writer, baseUrl + "/agent.aspx?id=" + rs["id"] + "&lang=cn", today, "monthly", "0.6");
                    }
                }
            }
        }
        catch { }

        // 4. 结束并输出 XML
        writer.WriteEndElement(); // end urlset
        writer.WriteEndDocument();
        writer.Flush();
        writer.Close();
        Response.End();
    }

    // 写入单个 URL 节点的辅助函数
    private void WriteUrl(XmlTextWriter writer, string loc, string lastmod, string changefreq, string priority)
    {
        writer.WriteStartElement("url");
        writer.WriteElementString("loc", loc.Replace("&", "&amp;")); // XML 中的 & 符号必须转义
        if (!string.IsNullOrEmpty(lastmod)) writer.WriteElementString("lastmod", lastmod);
        writer.WriteElementString("changefreq", changefreq);
        writer.WriteElementString("priority", priority);
        writer.WriteEndElement();
    }

    // 解析 Unix 时间戳转为 XML 标准日期格式 (yyyy-MM-dd)
    private string GetIsoDate(object timestamp)
    {
        if (timestamp == null || timestamp == DBNull.Value) return DateTime.Now.ToString("yyyy-MM-dd");
        
        double ts;
        if (double.TryParse(timestamp.ToString(), out ts) && ts > 0)
        {
            return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(ts).AddHours(8).ToString("yyyy-MM-dd");
        }
        return DateTime.Now.ToString("yyyy-MM-dd");
    }
</script>