/**
 * @file DogDatabase.h
 * @brief 地面机器人数据库管理类定义
 * @author CasualtySightPlus Team
 * @date 2025-06-30
 * @version 1.0
 * 
 * 地面机器人数据库管理类，提供机器人设备的数据存储和管理功能：
 * - 朼器人设备信息的增删改查
 * - 设备状态监控和更新
 * - 设备位置信息管理
 * - 数据库连接和事务处理
 * 
 * @note 使用单例模式确保全局唯一数据库实例
 * @note 依赖Qt SQL模块
 * @since 1.0
 */

#ifndef DOGDATABASE_H
#define DOGDATABASE_H

// Qt SQL头文件
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>

// Qt核心头文件
#include <QWidget>
#include <QString>
#include <QDebug>

// 项目内部头文件
#include "UAVDatabase.h"


/**
 * @struct Dog
 * @brief 地面机器人数据结构
 * 
 * 存储地面机器人设备的基本信息和状态数据。
 */
struct Dog
{
    QString id;         ///< 机器人唯一标识符
    int state;          ///< 机器人工作状态 (0:离线, 1:在线, 2:工作中, 3:错误)
    QString ip;         ///< 机器人 IP地址
    int port;           ///< 机器人通信端口
    double lon;         ///< 经度坐标
    double lat;         ///< 纬度坐标
};


/**
 * @class DogDatabase
 * @brief 地面机器人数据库管理类
 * 
 * 地面机器人数据库管理类，使用单例模式设计。
 * 提供地面机器人设备的全面数据管理功能。
 * 
 * 主要功能：
 * - 朼器人设备信息的CRUD操作
 * - 设备状态实时监控和查询
 * - 设备地理位置信息管理
 * - 数据库连接和事务处理
 * - SQL查询构建和执行
 * 
 * 设计模式：
 * - 单例模式：确保全局唯一数据库实例
 * - 线程安全：支持并发访问
 * 
 * @note 这是一个线程安全的单例类
 * @warning 使用前必须先调用getInstance()方法
 * @see UAVDatabase, Point
 * @since 1.0
 */
class DogDatabase
{
public:
    /**
     * @brief 获取单例实例
     * @return DogDatabase单例指针
     */
    static DogDatabase *getInstance();
    
    /**
     * @brief 析构函数
     */
    ~DogDatabase();
    
    /**
     * @brief 获取机器人状态信息
     * @param id 机器人唯一标识符
     * @return 机器人状态 (0:离线, 1:在线, 2:工作中, 3:错误)
     */
    int getDeviceState(const QString &id);
    
    /**
     * @brief 添加机器人数据记录
     * @param data 朼器人数据结构
     * @return 操作结果，true:成功, false:失败
     */
    bool addDevice(const Dog &data);
    
    /**
     * @brief 获取机器人位置信息
     * @param id 机器人唯一标识符
     * @return 朼器人位置坐标点
     */
    Point getDevicePosition(const QString &id);
    
    /**
     * @brief 获取当前机器人数据
     * @return 朼器人数据结构
     */
    Dog getCurrentData() const { return m_currentData; }

    /**
     * @brief 设置当前机器人数据
     * @param data 机器人数据结构
     */
    void setCurrentData(const Dog &data) { m_currentData = data; }



private:
    /**
     * @brief 私有构造函数（单例模式）
     */
    DogDatabase();
    
    /**
     * @brief 禁止拷贝构造函数
     */
    DogDatabase(const DogDatabase &) = delete;
    
    /**
     * @brief 禁止赋值操作符
     */
    DogDatabase &operator=(const DogDatabase &) = delete;
    
    /**
     * @brief 打开数据库连接
     * @param dbName 数据库名称
     * @param userName 用户名（可选）
     * @param passwd 密码（可选）
     * @return 连接结果，true:成功, false:失败
     */
    bool openDatabase(const QString &dbName, const QString &userName = QString(), const QString &passwd = QString());
    
    /**
     * @brief 关闭数据库连接
     */
    void closeDatabase();
    
    /**
     * @brief 开始添加字段
     * @param tableName 表名
     */
    void beginAddField(const QString &tableName);
    
    /**
     * @brief 添加字段
     * @param fieldName 字段名
     */
    void addField(const QString &fieldName);
    
    /**
     * @brief 结束添加字段
     */
    void endAddField();
    
    /**
     * @brief 开始添加数据行
     */
    void beginAddRow();
    
    /**
     * @brief 添加字段值
     * @param value 字段值
     */
    void addValue(const QVariant &value);
    
    /**
     * @brief 结束添加数据行
     */
    void endAddRow();
    
    /**
     * @brief 执行SQL语句
     * @param sql SQL语句
     * @return 执行结果，true:成功, false:失败
     */
    bool executeSQL(const QString &sql);

private:
    static DogDatabase *m_instance;         ///< 单例实例指针
    QSqlDatabase m_sqlDatabase;             ///< 数据库连接对象
    QString m_tableName;                    ///< 当前表名
    QStringList m_fieldNames;               ///< 字段名列表
    QString m_headerSQL;                    ///< SQL语句头部
    QString m_valueSQL;                     ///< SQL语句值部
    int m_fieldCount;                       ///< 已添加字段数量
    Dog m_currentData;                      ///< 当前机器人数据

};


#endif // DOGDATABASE_H
