from django.conf import settings
from django.core.cache import cache
from django.core.exceptions import ValidationError
from django.db import models
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _

from .common import ConfigCommonModel


class SiteSettings(ConfigCommonModel):
    # 强制主键为1的单例模式
    id = models.AutoField(primary_key=True, editable=False, default=1)
    site_name = models.CharField(verbose_name=_("网站名称"), max_length=300)
    site_title = models.CharField(verbose_name=_("网站标题"), max_length=300)

    language_code = models.CharField(
        verbose_name=_("网站语言"),
        max_length=10,
        choices=[
            ("zh-hans", _("简体中文")),
            ("zh-hant", _("繁體中文")),
            ("en", _("English")),
            ("en-us", _("English (US)")),
            ("en-gb", _("English (UK)")),
            ("ja", _("日本語")),
            ("ko", _("한국어")),
            ("es", _("Español")),
            ("es-es", _("Español (España)")),
            ("fr", _("Français")),
            ("de", _("Deutsch")),
            ("it", _("Italiano")),
            ("pt", _("Português")),
            ("pt-br", _("Português (Brasil)")),
            ("ru", _("Русский")),
            ("ar", _("العربية")),
            ("hi", _("हिन्दी")),
            ("th", _("ไทย")),
            ("vi", _("Tiếng Việt")),
            ("tr", _("Türkçe")),
            ("pl", _("Polski")),
            ("nl", _("Nederlands")),
            ("sv", _("Svenska")),
            ("da", _("Dansk")),
            ("fi", _("Suomi")),
            ("no", _("Norsk")),
            ("el", _("Ελληνικά")),
            ("he", _("עברית")),
            ("cs", _("Čeština")),
            ("hu", _("Magyar")),
            ("ro", _("Română")),
        ],
        default="zh-hans",
        help_text=_("设置网站默认显示语言"),
    )

    # 扩展的时区选择字段 - 包含全球主要时区
    time_zone = models.CharField(
        verbose_name=_("时区设置"),
        max_length=50,
        choices=[
            # 亚洲时区
            ("Asia/Shanghai", _("亚洲/上海 (UTC+8)")),
            ("Asia/Tokyo", _("亚洲/东京 (UTC+9)")),
            ("Asia/Seoul", _("亚洲/首尔 (UTC+9)")),
            ("Asia/Singapore", _("亚洲/新加坡 (UTC+8)")),
            ("Asia/Kolkata", _("亚洲/加尔各答 (UTC+5:30)")),
            ("Asia/Dubai", _("亚洲/迪拜 (UTC+4)")),
            ("Asia/Bangkok", _("亚洲/曼谷 (UTC+7)")),
            ("Asia/Jakarta", _("亚洲/雅加达 (UTC+7)")),
            ("Asia/Manila", _("亚洲/马尼拉 (UTC+8)")),
            ("Asia/Kuala_Lumpur", _("亚洲/吉隆坡 (UTC+8)")),
            ("Asia/Hong_Kong", _("亚洲/香港 (UTC+8)")),
            ("Asia/Taipei", _("亚洲/台北 (UTC+8)")),
            # 美洲时区
            ("America/New_York", _("美洲/纽约 (UTC-5)")),
            ("America/Chicago", _("美洲/芝加哥 (UTC-6)")),
            ("America/Denver", _("美洲/丹佛 (UTC-7)")),
            ("America/Los_Angeles", _("美洲/洛杉矶 (UTC-8)")),
            ("America/Toronto", _("美洲/多伦多 (UTC-5)")),
            ("America/Vancouver", _("美洲/温哥华 (UTC-8)")),
            ("America/Sao_Paulo", _("美洲/圣保罗 (UTC-3)")),
            ("America/Mexico_City", _("美洲/墨西哥城 (UTC-6)")),
            # 欧洲时区
            ("Europe/London", _("欧洲/伦敦 (UTC+0)")),
            ("Europe/Paris", _("欧洲/巴黎 (UTC+1)")),
            ("Europe/Berlin", _("欧洲/柏林 (UTC+1)")),
            ("Europe/Rome", _("欧洲/罗马 (UTC+1)")),
            ("Europe/Madrid", _("欧洲/马德里 (UTC+1)")),
            ("Europe/Moscow", _("欧洲/莫斯科 (UTC+3)")),
            ("Europe/Athens", _("欧洲/雅典 (UTC+2)")),
            ("Europe/Istanbul", _("欧洲/伊斯坦布尔 (UTC+3)")),
            ("Europe/Amsterdam", _("欧洲/阿姆斯特丹 (UTC+1)")),
            # 大洋洲时区
            ("Australia/Sydney", _("澳洲/悉尼 (UTC+10)")),
            ("Australia/Melbourne", _("澳洲/墨尔本 (UTC+10)")),
            ("Pacific/Auckland", _("太平洋/奥克兰 (UTC+12)")),
            # 其他重要时区
            ("UTC", _("协调世界时 (UTC)")),
            ("GMT", _("格林威治标准时间 (GMT)")),
            ("US/Pacific", _("美国/太平洋")),
            ("US/Central", _("美国/中部")),
            ("US/Eastern", _("美国/东部")),
        ],
        default="Asia/Shanghai",
        help_text=_("设置网站使用的时区"),
    )

    site_url = models.URLField(
        verbose_name=_("网站URL"),
        max_length=100,
        blank=True,
        help_text=mark_safe(
            _(
                """<div class="alert alert-info">
            <ul><li>当解析泛解析时，此URL将做为首页URL</li><li>如果需要进行URL推送，优先使用该设置的URL，所以一定要注意URL与搜索引擎验证的一致性。</li><li>推荐使用主域名，实测发现经常的www的索引很多了，但是site主域名的时候收录数少，但是在百度站长中如果添加了主域名就不会出现这种情况。</li></ul>
            </div>"""
            )
        ),
    )
    logo = models.ImageField(
        verbose_name=_("网站LOGO"),
        upload_to="images/logo/",  # 图片将上传至 MEDIA_ROOT/images/logo/ 目录
        blank=True,
        help_text=_("请上传网站的LOGO图片。"),
    )

    company_name = models.CharField(verbose_name=_("公司名称"), max_length=100, blank=True)
    webmaster = models.CharField(verbose_name=_("站长姓名"), max_length=100, blank=True)
    master_phone = models.CharField(verbose_name=_("联系电话"), max_length=20, blank=True)
    webmaster_email = models.EmailField(verbose_name=_("站长邮箱"), blank=True)
    meta_keywords = models.CharField(
        verbose_name=_("关键词"),
        max_length=100,
        blank=True,
        help_text=_('以英文逗号","隔开，推荐不要超过3个关键词'),
    )
    meta_description = models.TextField(verbose_name=_("网站描述"), max_length=10000, blank=True)

    global_js = models.TextField(
        verbose_name=_("整站通用JS"),
        blank=True,
        help_text=mark_safe(
            _(
                """<div class="alert alert-info">
            <p>此处添加的JS代码将全站生效，可用于统计代码、第三方服务集成等。</p>
            <p><strong>注意：请勿包含&lt;script&gt;标签</strong>。在模板中，该字段的内容通常已被置于 &lt;script&gt; 标签内。</p>
            </div>"""
            )
        ),
    )

    copyright = models.TextField(
        verbose_name=_("版权说明"),
        max_length=2000,
        default=_(
            """<p class="text-center"><a href="http://beian.miit.gov.cn/" target="_blank" rel="nofollow">XXXXXXXXX</a></p>"""
        ),
        blank=True,
        help_text="支持html",
    )

    def save(self, *args, **kwargs):
        # 保存原有的 site_url 用于比较
        old_site_url = None
        if self.pk:
            old_site_url = (
                SiteSettings.objects.filter(pk=self.pk).values_list("site_url", flat=True).first()
            )
        else:
            old_site_url = None

        # 单例模式验证
        if self.pk != 1 and self.pk is not None:
            raise ValidationError(_("只允许存在唯一配置（ID=1）"))

        # 处理关键词格式
        if self.meta_keywords:
            self.meta_keywords = self.meta_keywords.replace("，", ",")

        # 调用父类保存方法
        super().save(*args, **kwargs)

        # 同步刷新缓存
        cache.set(
            "site_config",
            SiteSettings.get_solo(),
            version=settings.SITE_CONFIG_CACHE_VERSION,
            timeout=None,
        )

        # 检查是否需要触发域名更新
        new_site_url = self.site_url
        if new_site_url and new_site_url != old_site_url:
            try:
                from apps.core.utils.djacore import update_url, validate_vip_auth

                is_valid, auth_info, message = validate_vip_auth()

                if is_valid and auth_info and "username" in auth_info:
                    username = auth_info["username"]
                    import threading

                    threading.Thread(target=update_url, args=(username,)).start()
            except Exception as e:
                import logging

                logger = logging.getLogger(__name__)
                logger.error(f"域名更新失败: {str(e)}")

    def delete(self, *args, **kwargs):
        raise ValidationError(_("禁止删除基础配置"))

    def __str__(self):
        return str(_("网站基础信息"))

    class Meta:
        verbose_name = _("网站基础信息设置")
        verbose_name_plural = _("网站基础信息设置")
