#ifndef FACEDATABASE_H
#define FACEDATABASE_H
#pragma once
#include <iostream>
#include <map>
//#include "ARCFaceRT.h"
#include "sqlite3.h"
#include <vector>
#include "ANSFRCommon.h"

namespace ANSCENTER {
    // Structured embedding record for double-buffer reload
    struct FaceEmbeddingRecord {
        int faceId;             // FACE.ID (unique per face)
        std::string userId;     // FACE.USER (= USER.ID, as string)
        std::vector<float> embedding;
    };

    class FaceDatabase {
    public:
        FaceDatabase();
        ~FaceDatabase();
        bool Destroy();
        bool Initialize(std::string path, int embeddingDim, std::string dataFolder);
        int InsertUser(std::string code, std::string userName);
        int UpdateUser(int UserId, std::string newUserCode, std::string newUserName);
        int InsertFace(int userId, std::string imgPath, float embedding[]);
        int DeleteFace(int id);
        int DeleteUser(int UserId);
        int GetFaceIdsByUser(int userId, std::vector<int>& faceIds);
        int GetUserId(std::string  code);
        int GetUser(int userId, std::string& code, std::string& userName);
        int GetUsers(std::vector<int>& ids, std::vector<std::string>& codes, std::vector<std::string>& userNames);
        // Fix #12: Batch query — returns users with their face IDs in a single query
        int GetUsersWithFaceIds(std::vector<int>& ids, std::vector<std::string>& codes,
            std::vector<std::string>& userNames, std::vector<std::vector<int>>& faceIdsByUser);
        int GetFaceById(int faceId, int& userId, std::string& imagePath);
        std::map<std::string, std::string> GetUserDict();
        int GetEmbeddings(ANSFRBase& recognizer);
        int GetEmbeddings(std::unique_ptr<ANSFRBase>& recognizer);
        // Returns all face embedding records (FACE.ID + USER.ID + embedding) for double-buffer reload
        int GetAllEmbeddingRecords(std::vector<FaceEmbeddingRecord>& records);
    private:
        sqlite3* m_db;
        int m_embedding_dim;
        std::string _dataFolder;
        std::mutex _mutex;
        // Fix #10: Logger for database operations
        ANSCENTER::SPDLogger& _logger = ANSCENTER::SPDLogger::GetInstance("FaceDB");
        int GetNumEmbeddings();
    };
}
#endif