import random

from apps.core.models.base import BaseModel
from django.core.validators import MaxValueValidator, MinValueValidator
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 PostSet(ConfigCommonModel):
    content_type = models.CharField(verbose_name=_('内容类型'),
                                    max_length=10,
                                    choices=[('db', '数据库'), ('txt', '文本文件')],
                                    default='db',
                                    help_text=mark_safe(
                                        _('''
            <div class="alert alert-info">
                <ul>
                    <li>数据库：从数据库中选择“发布状态”指定的文章进行发布</li>
                    <li>文本文件：txt文件，从/static/txt_files/<int:栏目id>/下选择txt文件进行发布，文件名为标题，内容为文章内容，没有关键词，简介可自动生成。</li>
                </ul>
            </div>
        ''')))

    editor_candidates = models.CharField(verbose_name=_('编辑候选人'),
                                         max_length=500,
                                         blank=True,
                                         default='',
                                         help_text=mark_safe(
                                             _('''
            <div class="alert alert-info">
                <ul>
                    <li>指定多个用户ID，用逗号分隔，如："1,3,5,7"</li>
                    <li>发布文章时会从这些用户中随机选择一个作为文章编辑</li>
                    <li>如果为空，则默认使用用户ID为1的用户</li>
                </ul>
            </div>
        ''')))

    num = models.IntegerField(
        verbose_name=_('处理文章数'),
        default=1,
        validators=[MinValueValidator(0),
                    MaxValueValidator(10)],
        help_text=mark_safe(
            _('''
            <div class="alert alert-info"><strong>请输入数字</strong>,例如"1"。当URL被访问触发后，系统会自动将草稿中"1"条内容变为审核状态，实现文章的展示。</div>
        ''')))

    publish_status = models.IntegerField(
        verbose_name=_('发布状态'),
        db_column='brestatus',
        choices=[c for c in BaseModel.StatusChoices.choices if c[0] != 99],
        default=BaseModel.StatusChoices.STORED,
    )

    nodekey = models.CharField(verbose_name=_('栏目控制'),
                               max_length=2000,
                               blank=True,
                               default='0',
                               help_text=mark_safe(
                                   _("""
            <div class="alert alert-info"><ul>
                <li>如果为0则在所有栏目中随机选择一个栏目的内容进行处理;</li>
                <li>如需指定栏目，请输入栏目ID，中间用逗号隔开。如"1,3,4,5"。系统将在指定栏目中随机选择一个栏目的内容进行处理</li>
                <li>容错处理：当输入错误的值，系统会按"0"值处理</li>
            </ul></div>
        """)))

    enable_remainder_alert = models.BooleanField(
        verbose_name=_('开启余量提示'),
        default=False,
        help_text=_('启用后当余量低于阈值时发送通知'))

    remainder_threshold = models.PositiveIntegerField(
        verbose_name=_('余量阈值'),
        default=5,
        validators=[MinValueValidator(1)],
        help_text=_('当剩余文章数量低于此值时触发提醒'))

    class Meta:
        verbose_name = _('文章发布配置')
        verbose_name_plural = _('文章发布配置')

    def __str__(self):
        return str(_("文章发布配置"))

    def get_random_editor_id(self):
        """从候选用户中随机选择一个用户ID，如果为空则返回1"""
        if not self.editor_candidates or not self.editor_candidates.strip():
            return 1  # 默认用户ID

        try:
            # 解析用户ID列表
            user_ids = [
                uid.strip() for uid in self.editor_candidates.split(',')
                if uid.strip()
            ]
            if not user_ids:
                return 1

            # 随机选择一个用户ID
            selected_user_id = random.choice(user_ids)
            return int(selected_user_id)
        except (ValueError, IndexError):
            # 如果解析失败，使用默认用户ID
            return 1
