from django import forms
from django.contrib import admin
from django.db import models
from django.utils.safestring import mark_safe
from django_json_widget.widgets import JSONEditorWidget

from ..models.ai_config import AiConfig
from .mixins import SingletonAdminMixin


class AiConfigForm(forms.ModelForm):
    """自定义表单用于版本切换"""

    class Meta:
        model = AiConfig
        fields = '__all__'
        widgets = {
            'api_version':
            forms.RadioSelect(choices=AiConfig.API_VERSION_CHOICES),
        }


@admin.register(AiConfig)
class AiConfigAdmin(SingletonAdminMixin, admin.ModelAdmin):
    change_form_template = 'admin/core/ai_config/ai_config.html'
    form = AiConfigForm
    formfield_overrides = {
        models.JSONField: {
            'widget':
            JSONEditorWidget(
                mode='code',
                options={
                    'modes': ['code'],
                    'theme': 'github',
                    'lineNumbers': False,
                    'indentation': 2,
                    'autoFormat': True
                },
                height='400px',
            )
        }
    }

    fieldsets = [
        ('', {
            'description':
            mark_safe('<div class="alert alert-success">'
                      '该功能使用的是百度AI千帆大模型，在目前来讲大厂AI只有百度有三个免费的模型，我们多数使用的为免费模型'
                      '本设置支持新版本的收费和免费模型。'
                      '</div>'),
            'fields': (),
        }),
        ('API版本设置', {
            'description':
            mark_safe(
                '<div class="alert alert-warning">'
                '<strong>重要提示：</strong><br>请根据您使用的API服务选择合适的版本。<br>'
                '旧版使用传统的API_KEY+SECRET_KEY认证，新版使用千帆模型的Bearer Token认证。<br>推荐使用V2。如何获取百度千帆大模型V2密钥和APP ID，请参详《<a href="//www.djacore.com/cjwt/23.html" target="_blank">如何获取百度千帆大模型V2 API密钥</a>》'
                '</div>'),
            'fields': ['api_version']
        }),
        ('旧版API配置', {
            'classes': ('version-v1', ),
            'description':
            mark_safe('<div class="alert alert-info">'
                      '我们采用的是百度AI大模型旧版API，因为只有百度可以支持我们免费使用。'
                      '如果需要其他模型的可以联系我们进行定制。'
                      '</div>'),
            'fields': ['api_key', 'secret_key']
        }),
        ('新版千帆API配置', {
            'classes': ('version-v2', ),
            'description':
            mark_safe(
                '<div class="alert alert-info">'
                '<strong>新版千帆API说明：</strong><br>'
                '• 密钥：系统会自动添加Bearer前缀进行认证<br>'
                '• 免费模型：ERNIE-Speed-128K、ERNIE-Lite-128K-0419、ERNIE-Tiny-8K<br>'
                '• Temperature和Top P建议只设置其中一个参数'
                '</div>'),
            'fields': [
                'authorization_key', 'qianfan_model', 'qianfan_appid',
                'temperature', 'top_p', 'penalty_score'
            ]
        }),
        ('内容生成设置', {
            'description':
            mark_safe('''
                <div class="alert alert-info">
                <p>我们会从/static/aiwords/文件夹取关键词，起名以栏目id为名，比如栏目1的关键词为1.txt，编码为utf-8，每行一词。我们使用完词会进行删除处理。</p>
                <p>URL GET 触发：http（s）://host/api/create-ai-article?code=安全码。安全码须在安全码设置中设置</p>
                </div>
            '''),
            'fields': ['editor', 'keywords_num', 'get_type', 'replace', 'end']
        }),
        ('Tag AI设置', {
            'fields': ['tag_switch', 'tag_ai_type', 'tag_prompt', 'tag_end']
        }),
    ]

    # class Media:
    #     css = {
    #         'all': ('admin/css/version_switch.css',)
    #     }
    #     js = ('admin/js/version_switch.js',)
