package com.axis.innovators.box.register;

import com.axis.innovators.box.AxisInnovatorsBox;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * 注册主题类，用于管理和注册主题。
 * 该类允许添加主题，并提供了一系列方法来获取和管理已注册的主题。
 * <p>
 * 主要功能：
 * - 注册主题类或 LookAndFeel 主题
 * - 检查主题是否已加载
 * - 设置主题加载状态
 * - 检查主题列表是否为空
 * - 获取已注册的主题类、主题名、图标、提示信息等
 * 
 * @author tzdwindows 7
 */
public class RegistrationTopic {
    private final Logger logger = LogManager.getLogger(RegistrationTopic.class);
    private final List<String> topicsClasses =  new ArrayList<>();
    private final List<LookAndFeel> topicsClassesLookAndFeel =  new ArrayList<>();
    private final List<String> topicsName =  new ArrayList<>();
    private final List<String> registeredNameList = new ArrayList<>();
    private final List<Icon> iconList = new ArrayList<>();
    private final List<String> tipList = new ArrayList<>();
    private final AxisInnovatorsBox axisInnovatorsBox;
    private String loadTopics = "";

    /**
     * 构造函数，初始化 RegistrationTopic 实例。
     * 
     * @param axisInnovatorsBox AxisInnovatorsBox 实例，用于检查窗口状态
     */
    public RegistrationTopic(AxisInnovatorsBox axisInnovatorsBox) {
        this.axisInnovatorsBox = axisInnovatorsBox;
    }

    /**
     * 注册主题类。
     * 
     * @param topicClass 主题类名
     * @param topicName 主题名称
     * @param tip 主题提示信息
     * @param icon 主题图标
     * @param registeredName 主题注册名
     * @throws RegistrationError 如果注册名已存在，则抛出异常
     */
    public void addTopic(String topicClass, String topicName, String tip ,Icon icon, String registeredName) {
        if (!axisInnovatorsBox.isWindow()) {
            if (registeredNameList.contains(registeredName)) {
                throw new RegistrationError(registeredName + " duplicate registered names");
            }
            topicsClasses.add(topicClass);
            topicsClassesLookAndFeel.add(null);
            topicsName.add(topicName);
            tipList.add(tip);
            iconList.add(icon);
            registeredNameList.add(registeredName);
        } else {
            logger.warn("Wrong time to add topics");
        }
    }

    /**
     * 注册 LookAndFeel 主题。
     * 
     * @param topicClass LookAndFeel 主题类
     * @param topicName 主题名称
     * @param tip 主题提示信息
     * @param icon 主题图标
     * @param registeredName 主题注册名
     * @throws RegistrationError 如果注册名已存在，则抛出异常
     */
    public void addTopic(LookAndFeel topicClass, String topicName, String tip ,Icon icon, String registeredName) {
        if (!axisInnovatorsBox.isWindow()) {
            if (registeredNameList.contains(registeredName)) {
                throw new RegistrationError(registeredName + " duplicate registered names");
            }
            topicsClasses.add(null);
            topicsClassesLookAndFeel.add(topicClass);
            topicsName.add(topicName);
            tipList.add(tip);
            iconList.add(icon);
            registeredNameList.add(registeredName);
        } else {
            logger.warn("Wrong time to add topics");
        }
    }

    /**
     * 检查指定主题是否已加载。
     * 
     * @param loading 要检查的主题名
     * @return 如果主题已加载，则返回 true；否则返回 false
     */
    public boolean isLoading(String loading) {
        if (loadTopics.isEmpty()) {
            return false;
        }
        return Objects.equals(loading, loadTopics);
    }

    /**
     * 设置当前加载的主题。
     * 
     * @param loading 要加载的主题名
     */
    public void setLoading(String loading) {
        loadTopics = loading;
    }

    /**
     * 检查主题列表是否为空。
     * 
     * @return 如果主题列表为空，则返回 true；否则返回 false
     */
    public boolean isEmpty() {
        return registeredNameList.isEmpty();
    }

    /**
     * 获取已注册的主题类列表。
     * 
     * @return 主题类列表
     */
    public List<String> getTopicsClasses() {
        return topicsClasses;
    }

    /**
     * 获取 AxisInnovatorsBox 实例。
     * 
     * @return AxisInnovatorsBox 实例
     */
    public AxisInnovatorsBox getAxisInnovatorsBox() {
        return axisInnovatorsBox;
    }

    /**
     * 获取已注册的 LookAndFeel 主题类列表。
     * 
     * @return LookAndFeel 主题类列表
     */
    public List<LookAndFeel> getTopicsClassesLookAndFeel() {
        return topicsClassesLookAndFeel;
    }

    /**
     * 获取已注册的主题图标列表。
     * 
     * @return 主题图标列表
     */
    public List<Icon> getIconList() {
        return iconList;
    }

    /**
     * 获取已注册的主题名列表。
     * 
     * @return 主题名列表
     */
    public List<String> getRegisteredNameList() {
        return registeredNameList;
    }

    /**
     * 获取已注册的主题提示信息列表。
     * 
     * @return 主题提示信息列表
     */
    public List<String> getTipList() {
        return tipList;
    }

    /**
     * 获取已注册的主题名称列表。
     * 
     * @return 主题名称列表
     */
    public List<String> getTopicsName() {
        return topicsName;
    }
}
