from django import forms
from django.contrib import admin, messages
from django.utils.safestring import mark_safe

from ..models import TagPageConfig
from .mixins import SingletonAdminMixin


class TagPageConfigForm(forms.ModelForm):
    """TagPageConfig 表单定制"""

    class Meta:
        model = TagPageConfig
        fields = "__all__"
        widgets = {
            "title_templates": forms.Textarea(
                attrs={"rows": 8, "placeholder": "每行一个标题模板，支持 {{ obj.title }} 变量"}
            ),
            "intro_templates": forms.Textarea(
                attrs={"rows": 12, "placeholder": "支持HTML标签，每段用空行分隔，随机选择一段使用"}
            ),
            "default_intro_template": forms.Textarea(
                attrs={"rows": 6, "placeholder": "当简介多样性关闭时使用的默认模板"}
            ),
            "title_connector": forms.TextInput(attrs={"placeholder": "如：， ？ —— 等"}),
        }

    def clean_fill_empty_count(self):
        """验证补空文章数量"""
        count = self.cleaned_data.get("fill_empty_count")
        if count < 1:
            raise forms.ValidationError("补空文章数量必须大于0")
        if count > 50:
            raise forms.ValidationError("补空文章数量不能超过50")
        return count


@admin.register(TagPageConfig)
class TagPageConfigAdmin(SingletonAdminMixin, admin.ModelAdmin):
    """标签页面配置管理"""

    # form = TagPageConfigForm

    # 列表显示字段（虽然单例模式通常不显示列表，但保留以防万一）
    list_display = [
        "id",
        "title_diversity_enabled",
        "intro_diversity_enabled",
    ]

    # 字段分组显示
    fieldsets = (
        (
            "标题多样化设置",
            {
                "fields": (
                    "title_diversity_enabled",
                    "title_templates",
                    "title_connector_templates",
                ),
                "classes": ("wide", "extrapretty"),
                "description": mark_safe(
                    """<div class="alert alert-info">
                <p>控制标签页面标题的多样性显示。如果你为新站那么可以打开标题多样性，如果你为老站我们的建站是不打开，拒说标题更换会引起seo的变化。具体情况自行斟酌</p>                      
                </div>"""
                ),
            },
        ),
        (
            "简介多样化设置",
            {
                "fields": (
                    "intro_diversity_enabled",
                    "intro_templates",
                    "default_intro_template",
                ),
                "classes": ("wide",),
                "description": mark_safe(
                    """<div class="alert alert-info">
                <p>控制标签简介的多样性显示</p>
                </div>"""
                ),
            },
        ),
        (
            "",
            {
                "description": mark_safe(
                    """<div class="alert alert-info">
<p style=" font-weight: bold;font-size:130%">使用提示：</p>
<p>如果需要清空多样化产化的标题和简介只需要在终端中进行如下操作</p>
<pre style="background-color: #0e0e0e;border-radius: 0.3rem;padding: 0.5rem 1rem;color: #e2e2e2;"><code>
# 首先进入 shell 环境
python manage.py shell
# 使用update方法批量清空字段
Tag.objects.all().update(generated_title='', generated_intro='')
# 如果你要只清楚多样化产生的标题
Tag.objects.all().update(generated_title='')
# 如果你要只清楚多样化产生的简介
Tag.objects.all().update( generated_intro='')
                      </code></pre>
                </div>"""
                ),
                "fields": (),
            },
        ),
        (
            "文章列表策略",
            {
                "fields": (
                    "word_split_enabled",
                    "concurrent_update_enabled",
                    "fill_empty_strategy",
                    "fill_empty_count",
                ),
                "classes": ("wide",),
                "description": mark_safe(
                    """<div class="alert alert-info">
                <p>设置标签相关内容的获取内容列表。系统默认直接调出相关内容，以下设置可以丰富页面内容。逻辑为相关内容>拆词搜索>补空</p>                      
                </div>"""
                ),
            },
        ),
        (
            "",
            {
                "description": mark_safe(
                    """<div class="alert alert-info">
<p style=" font-weight: bold;font-size:130%">tag页面批量处理分词加载方法：</p>
<p>在现有的情况下系统会在每次加载tag或者文章的时候对标题对行分词处理，经过分词处理后将再不需要进行此项操作。但是这里访客和蜘蛛将所有的页面访问到才可以将所有的tag和文章都处理完。如果你想快速的处理完那么可以在<strong>终端</strong>进行以下操作</p>
<pre style="background-color: #0e0e0e;border-radius: 0.3rem;padding: 0.5rem 1rem;color: #e2e2e2;"><code>
基本用法（支持从上次中断处继续）
# 使用进度文件自动断点续传
python manage.py migrate_cutwords --chunk-size 1000 --resume-file progress.json
# 标签从第150000条开始，文章从第4000条开始
python manage.py migrate_cutwords --model all --chunk-size 1000 --tag-start-id 150000 --article-start-id 4000
指定起始位置
# 只处理文章，从第4000条开始
python manage.py migrate_cutwords --model article --chunk-size 1500 --article-start-id 4000

# 只处理标签，从第150000条开始
python manage.py migrate_cutwords --model tag --chunk-size 2000 --tag-start-id 150000
结合进度文件使用
# 第一次运行（会创建进度文件）
python manage.py migrate_cutwords --chunk-size 1000 --resume-file migration_progress.json

# 如果中途中断，再次运行相同的命令即可从断点继续
python manage.py migrate_cutwords --chunk-size 1000 --resume-file migration_progress.json
                      </code></pre>
<p>我们测试500W需要6-8小时处理时间。处理期间不影响网站性能。</p>
                </div>"""
                ),
                "fields": (),
            },
        ),
    )

    # 自定义操作
    actions = ["enable_all_features", "disable_all_features"]

    def enable_all_features(self, request, queryset):
        """启用所有功能"""
        for config in queryset:
            config.title_diversity_enabled = True
            config.intro_diversity_enabled = True
            config.use_related_articles = True
            config.word_split_enabled = True
            config.save()
        self.message_user(request, "已启用所有标签页面功能")

    enable_all_features.short_description = "启用所有功能"

    def disable_all_features(self, request, queryset):
        """禁用所有功能"""
        for config in queryset:
            config.title_diversity_enabled = False
            config.intro_diversity_enabled = False
            config.use_related_articles = False
            config.word_split_enabled = False
            config.save()
        self.message_user(request, "已禁用所有标签页面功能")

    disable_all_features.short_description = "禁用所有功能"

    # 自定义保存逻辑
    def save_model(self, request, obj, form, change):
        """保存模型时的自定义逻辑"""
        # 调用父类的保存方法（包括 SingletonAdminMixin 的保存逻辑）
        super().save_model(request, obj, form, change)

        # 额外的保存后逻辑
        self._post_save_actions(request, obj)

    def _post_save_actions(self, request, obj):
        """保存后的后续操作"""
        # 验证标题模板格式
        title_templates = obj.get_title_templates_list()
        if len(title_templates) < 2 and obj.title_diversity_enabled:
            self.message_user(
                request,
                "警告：标题多样性已启用但模板数量不足2个，建议添加更多模板",
                level=messages.WARNING,
            )

        # 验证简介模板格式
        intro_templates = obj.get_intro_templates_list()
        if len(intro_templates) < 1 and obj.intro_diversity_enabled:
            self.message_user(
                request, "警告：简介多样性已启用但未找到有效模板", level=messages.WARNING
            )

        # 检查补空策略配置
        if obj.fill_empty_strategy != "none" and obj.fill_empty_count == 0:
            self.message_user(request, "警告：已启用补空策略但补空数量为0", level=messages.WARNING)

    # 自定义表单验证
    def clean(self):
        """表单级别验证"""
        cleaned_data = super().clean()

        # 如果启用拆词策略但未启用相关文章，给出警告
        if cleaned_data.get("word_split_enabled") and not cleaned_data.get("use_related_articles"):
            self.add_warning("已启用拆词策略但未启用相关文章，拆词策略可能不会生效")

        return cleaned_data

    # 自定义模板（可选）
    # change_form_template = 'admin/tagpageconfig/change_form.html'

    # # 添加自定义媒体文件（如果需要）
    # class Media:
    #     css = {
    #         'all': ('css/admin/tagpageconfig.css',)
    #     }
    #     js = ('js/admin/tagpageconfig.js',)
