"""admin ext — 管理后台数据库扩展迁移

新增 config_change_logs 表（配置变更日志）。
扩展 agents 表：新增 role（角色）和 skill_tags（技能标签）字段。
扩展 quick_reply_templates 表：新增 status（审核状态）、version（版本号）、
submitted_by（提交人）字段。

Revision ID: 006_admin_ext
Revises: 005_reply_to_id
Create Date: 2026-07-15 10:00:00.000000

注:filename 与 revision 字符串一致(v0.5.1 修复)
原 filename `006_admin_extension.py` 改名为 `006_admin_ext.py`,
revision 字符串保持 `006_admin_ext` 不变(DB alembic_version 表已存此值,
改 revision 会破坏 chain)。
"""

from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa

# revision identifiers, used by Alembic.
revision: str = '006_admin_ext'
down_revision: Union[str, None] = '005_reply_to_id'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    """执行管理后台数据库扩展迁移。"""

    # 1. 创建 config_change_logs 表
    op.create_table(
        'config_change_logs',
        sa.Column('id', sa.String(36), primary_key=True),
        sa.Column('config_key', sa.String(128), nullable=False, comment='配置键'),
        sa.Column('old_value', sa.Text, nullable=False, server_default='', comment='变更前的值'),
        sa.Column('new_value', sa.Text, nullable=False, server_default='', comment='变更后的值'),
        sa.Column('changed_by', sa.String(36), nullable=False, comment='变更操作人 agent_id'),
        sa.Column('changed_at', sa.DateTime(timezone=True), nullable=False,
                  server_default=sa.func.now(), comment='变更时间'),
    )
    # 创建索引
    op.create_index('idx_ccl_config_key', 'config_change_logs', ['config_key'])
    op.create_index('idx_ccl_changed_at', 'config_change_logs', ['changed_at'])

    # 2. 给 agents 表新增 role 字段
    op.add_column(
        'agents',
        sa.Column(
            'role',
            sa.String(20),
            nullable=False,
            server_default='agent',
            comment='角色：admin=组长, agent=坐席',
        )
    )

    # 3. 给 agents 表新增 skill_tags 字段
    op.add_column(
        'agents',
        sa.Column(
            'skill_tags',
            sa.JSON,
            nullable=False,
            server_default='[]',
            comment='技能标签列表（电脑/软件/外设/网络/安全/资产/其他）',
        )
    )

    # 4. 给 quick_reply_templates 表新增 status 字段
    op.add_column(
        'quick_reply_templates',
        sa.Column(
            'status',
            sa.String(20),
            nullable=False,
            server_default='approved',
            comment='状态：draft/pending_review/approved/rejected',
        )
    )

    # 5. 给 quick_reply_templates 表新增 version 字段
    op.add_column(
        'quick_reply_templates',
        sa.Column(
            'version',
            sa.Integer(),
            nullable=False,
            server_default='1',
            comment='版本号，每次审核通过后 +1',
        )
    )

    # 6. 给 quick_reply_templates 表新增 submitted_by 字段
    op.add_column(
        'quick_reply_templates',
        sa.Column(
            'submitted_by',
            sa.String(36),
            nullable=True,
            comment='提交人 agent_id',
        )
    )


def downgrade() -> None:
    """回滚管理后台数据库扩展迁移。"""

    # 删除 quick_reply_templates 新增字段
    op.drop_column('quick_reply_templates', 'submitted_by')
    op.drop_column('quick_reply_templates', 'version')
    op.drop_column('quick_reply_templates', 'status')

    # 删除 agents 新增字段
    op.drop_column('agents', 'skill_tags')
    op.drop_column('agents', 'role')

    # 删除 config_change_logs 表索引和表
    op.drop_index('idx_ccl_changed_at', table_name='config_change_logs')
    op.drop_index('idx_ccl_config_key', table_name='config_change_logs')
    op.table('config_change_logs')
    op.drop_table('config_change_logs')
