#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
JSON 修复工具函数
"""

import json
import re


def _fix_json(json_str: str) -> str:
    """修复常见的JSON格式问题"""
    # 去除尾部多余的逗号
    json_str = re.sub(r',(\s*[}\]])', r'\1', json_str)

    # 确保 JSON 结构闭合
    json_str = _ensure_json_closed(json_str)

    # 替换单引号为双引号（但要小心内容中的单引号）
    # 使用更精确的方法：先尝试解析，失败再替换
    try:
        json.loads(json_str)
        return json_str
    except Exception:
        # 尝试替换单引号
        json_str = json_str.replace("'", '"')

    return json_str


def _truncate_to_valid_json(json_str: str) -> str:
    """将截断的JSON截断到最后一个完整对象的位置，并保留数组结构"""
    # 找到 "classified_contents" 数组的开始
    array_start = json_str.find('"classified_contents"')
    if array_start == -1:
        return json_str

    # 找到数组的 '['
    bracket_start = json_str.find('[', array_start)
    if bracket_start == -1:
        return json_str

    # 遍历数组，找到最后一个完整的对象
    brace_count = 0
    bracket_count = 1  # 已经进入数组，所以是1
    in_string = False
    escape_next = False
    last_valid_obj_end = 0
    i = bracket_start + 1

    while i < len(json_str):
        char = json_str[i]

        if escape_next:
            escape_next = False
            i += 1
            continue

        if char == '\\':
            escape_next = True
            i += 1
            continue

        if char == '"' and not escape_next:
            in_string = not in_string
            i += 1
            continue

        if not in_string:
            if char == '{':
                brace_count += 1
            elif char == '}':
                brace_count -= 1
                if brace_count == 0:
                    # 找到一个完整的对象
                    last_valid_obj_end = i
            elif char == '[':
                bracket_count += 1
            elif char == ']':
                bracket_count -= 1
                if bracket_count == 0:
                    # 数组正常闭合，不需要截断
                    return json_str

        i += 1

    if last_valid_obj_end > 0:
        # 截断到最后一个完整对象的位置，并关闭数组
        return json_str[:last_valid_obj_end + 1] + ']'

    return json_str


def _ensure_json_closed(json_str: str) -> str:
    """确保JSON结构闭合"""
    # 计算未闭合的括号
    brace_count = 0
    bracket_count = 0
    in_string = False
    escape_next = False

    for char in json_str:
        if escape_next:
            escape_next = False
            continue
        if char == '\\':
            escape_next = True
            continue
        if char == '"' and not escape_next:
            in_string = not in_string
            continue
        if not in_string:
            if char == '{':
                brace_count += 1
            elif char == '}':
                brace_count -= 1
            elif char == '[':
                bracket_count += 1
            elif char == ']':
                bracket_count -= 1

    # 添加闭合括号
    result = json_str
    # 先去掉尾部可能的逗号
    result = result.rstrip().rstrip(',').rstrip()

    # 关闭对象
    while brace_count > 0:
        result += '}'
        brace_count -= 1

    # 关闭数组
    while bracket_count > 0:
        result += ']'
        bracket_count -= 1

    return result


def _aggressive_json_fix(json_str: str) -> str:
    """激进的JSON修复，用于处理复杂情况"""
    # 首先尝试截断到最后一个完整对象
    json_str = _truncate_to_valid_json(json_str)
    # 然后确保结构闭合
    json_str = _ensure_json_closed(json_str)
    return json_str
