#ifndef BASEWIDGET_H
#define BASEWIDGET_H

#include <QObject>
#include <QWidget>

/**
 * @class BaseWidget
 * @brief BaseWidget 是一个基于 QWidget 的抽象基类，用于管理表单状态和修改标记。
 * 
 * BaseWidget 提供了管理当前表单、前一个表单和修改标记的功能。它是一个抽象类，不能直接实例化。
 * 子类需要实现 returnParent() 方法，并可以重载其他方法以提供特定的行为。
 * 
 * @note 子类必须实现 returnParent() 方法。
 * 
 * @param parent 指向父 QWidget 的指针，默认为 nullptr。
 */
class BaseWidget : public QWidget
{
    Q_OBJECT
public:
    /**
     * @brief 构造函数，创建一个新的 BaseWidget 实例。
     * 
     * @param parent 指向父 QWidget 的指针，默认为 nullptr。
     */
    explicit BaseWidget(QWidget *parent = nullptr);

    /**
     * @brief 返回父 QWidget 的指针。
     * 
     * @return 父 QWidget 的指针。
     */
    virtual bool returnParent() = 0;

    /**
     * @brief 获取当前表单的索引。
     * 
     * @return 当前表单的索引。
     */
    int currentForm() const;

    /**
     * @brief 设置当前表单的索引。
     * 
     * @param newCurrentForm 新的当前表单索引。
     */
    void setCurrentForm(int newCurrentForm);

    /**
     * @brief 获取前一个表单的索引。
     * 
     * @return 前一个表单的索引。
     */
    int prevForm() const;

    /**
     * @brief 设置前一个表单的索引。
     * 
     * @param newPrevForm 新的前一个表单索引。
     */
    void setPrevForm(int newPrevForm);

    /**
     * @brief 检查是否有修改。
     * 
     * @return 如果有修改返回 true，否则返回 false。
     */
    bool isModify() const;

    /**
     * @brief 设置修改标记。
     * 
     * @param newIsModify 新的修改标记。
     */
    void setIsModify(bool newIsModify);

signals:
    /**
     * @brief 当标题刷新时发出此信号。
     * 
     * @param title 新的标题。
     */
    void refreshTitles(const QString& title);

private:
    /**
     * @brief 当前表单的索引。
     */
    int m_currentForm;

    /**
     * @brief 前一个表单的索引。
     */
    int m_prevForm;

    /**
     * @brief 修改标记。
     */
    bool m_isModify = false;
};

#endif // BASEWIDGET_H
