import json
from zlapi.models import Message, ThreadType
from config import PREFIX, ADMIN

des = {
    'version': "1.0.0",
    'credits': "HVHVZ",
    'description': "Thêm sản phẩm",
    'power': "Quản trị viên"
}

def load_price_list():
    try:
        with open('modules/cache/price_list.json', 'r', encoding='utf-8') as f:
            data = json.load(f)
            return data if isinstance(data, dict) else {}
    except Exception:
        return {}

def save_price_list(data):
    try:
        with open('modules/cache/price_list.json', 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=4)
        return True
    except Exception:
        return False

def handle_addsp_command(message, message_object, thread_id, thread_type, author_id, client):
    try:
        if str(author_id) not in ADMIN:
            error_msg = "❌ Chỉ quản trị viên mới có thể sử dụng lệnh này!"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        parts = message.split(" ", 2)
        if len(parts) < 3 or not parts[1].strip() or not parts[2].strip():
            error_msg = f"❌ Vui lòng cung cấp mã sản phẩm và tên sản phẩm. Ví dụ: {PREFIX}addsp gemini Gemini Pro"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        product_code = parts[1].strip()
        product_name = parts[2].strip()

        price_list = load_price_list()
        if product_code in price_list:
            error_msg = f"❌ Mã sản phẩm '{product_code}' đã tồn tại!"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        price_list[product_code] = {
            "name": product_name,
            "packages": []
        }

        if not save_price_list(price_list):
            error_msg = "❌ Lỗi khi lưu sản phẩm vào file JSON!"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        success_msg = f"✅ Đã thêm sản phẩm: {product_name} ({product_code})\nVui lòng thêm gói với lệnh: {PREFIX}addgoi {{số thứ tự gói}} {product_code} {{content}}"
        client.replyMessage(Message(text=success_msg), message_object, thread_id, thread_type, ttl=60000)

    except Exception as e:
        error_msg = f"❌ Lỗi không xác định: {str(e)}. Vui lòng thử lại!"
        client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)

def handle_addgoi_command(message, message_object, thread_id, thread_type, author_id, client):
    try:
        if str(author_id) not in ADMIN:
            error_msg = "❌ Chỉ quản trị viên mới có thể sử dụng lệnh này!"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        parts = message.split(" ", 3)
        if len(parts) < 4 or not parts[1].strip() or not parts[2].strip() or not parts[3].strip():
            error_msg = f"❌ Vui lòng cung cấp đầy đủ thông tin. Ví dụ: {PREFIX}addgoi 1 gemini Gemini 12 tháng: 180k"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        package_number = parts[1].strip()
        product_code = parts[2].strip()
        package_content = parts[3].strip()

        price_list = load_price_list()
        if product_code not in price_list:
            error_msg = f"❌ Mã sản phẩm '{product_code}' không tồn tại!"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        for package in price_list[product_code]["packages"]:
            if package["number"] == package_number:
                error_msg = f"❌ Gói {package_number} đã tồn tại trong sản phẩm {product_code}!"
                client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
                return

        price_list[product_code]["packages"].append({
            "number": package_number,
            "content": package_content
        })

        if not save_price_list(price_list):
            error_msg = "❌ Lỗi khi lưu gói vào file JSON!"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        success_msg = f"✅ Đã thêm gói {package_number} cho sản phẩm {product_code}:\n{package_content}"
        client.replyMessage(Message(text=success_msg), message_object, thread_id, thread_type, ttl=60000)

    except Exception as e:
        error_msg = f"❌ Lỗi không xác định: {str(e)}. Vui lòng thử lại!"
        client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)

def handle_delgoi_command(message, message_object, thread_id, thread_type, author_id, client):
    try:
        if str(author_id) not in ADMIN:
            error_msg = "❌ Chỉ quản trị viên mới có thể sử dụng lệnh này!"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        parts = message.split(" ", 2)
        if len(parts) < 3 or not parts[1].strip() or not parts[2].strip():
            error_msg = f"❌ Vui lòng cung cấp số thứ tự gói và mã sản phẩm. Ví dụ: {PREFIX}delgoi 1 gemini"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        package_number = parts[1].strip()
        product_code = parts[2].strip()

        price_list = load_price_list()
        if product_code not in price_list:
            error_msg = f"❌ Mã sản phẩm '{product_code}' không tồn tại!"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        package_to_remove = None
        for package in price_list[product_code]["packages"]:
            if package["number"] == package_number:
                package_to_remove = package
                break

        if not package_to_remove:
            error_msg = f"❌ Gói {package_number} không tồn tại trong sản phẩm {product_code}!"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        price_list[product_code]["packages"].remove(package_to_remove)

        if not save_price_list(price_list):
            error_msg = "❌ Lỗi khi lưu bảng giá sau khi xóa gói!"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        success_msg = f"✅ Đã xóa gói {package_number} của sản phẩm {product_code}!"
        client.replyMessage(Message(text=success_msg), message_object, thread_id, thread_type, ttl=60000)

    except Exception as e:
        error_msg = f"❌ Lỗi không xác định: {str(e)}. Vui lòng thử lại!"
        client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)

def handle_editgoi_command(message, message_object, thread_id, thread_type, author_id, client):
    try:
        if str(author_id) not in ADMIN:
            error_msg = "❌ Chỉ quản trị viên mới có thể sử dụng lệnh này!"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        parts = message.split(" ", 3)
        if len(parts) < 4 or not parts[1].strip() or not parts[2].strip() or not parts[3].strip():
            error_msg = f"❌ Vui lòng cung cấp số thứ tự gói, mã sản phẩm và nội dung mới. Ví dụ: {PREFIX}editgoi 1 gemini Gemini 12 tháng: 200k"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        package_number = parts[1].strip()
        product_code = parts[2].strip()
        new_content = parts[3].strip()

        price_list = load_price_list()
        if product_code not in price_list:
            error_msg = f"❌ Mã sản phẩm '{product_code}' không tồn tại!"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        package_to_edit = None
        for package in price_list[product_code]["packages"]:
            if package["number"] == package_number:
                package_to_edit = package
                break

        if not package_to_edit:
            error_msg = f"❌ Gói {package_number} không tồn tại trong sản phẩm {product_code}!"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        package_to_edit["content"] = new_content

        if not save_price_list(price_list):
            error_msg = "❌ Lỗi khi lưu bảng giá sau khi sửa gói!"
            client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)
            return

        success_msg = f"✅ Đã sửa gói {package_number} của sản phẩm {product_code}:\n{new_content}"
        client.replyMessage(Message(text=success_msg), message_object, thread_id, thread_type, ttl=60000)

    except Exception as e:
        error_msg = f"❌ Lỗi không xác định: {str(e)}. Vui lòng thử lại!"
        client.replyMessage(Message(text=error_msg), message_object, thread_id, thread_type, ttl=60000)

def ft_vxkiue():
    return {
        'addsp': handle_addsp_command,
        'addgoi': handle_addgoi_command,
        'delgoi': handle_delgoi_command,
        'editgoi': handle_editgoi_command
    }