const db = require('../config/database');

class BaseModel {
    constructor() {
        this.db = db;
    }

    safeString(str) {
        if (typeof str !== 'string') return '';
        let cleanStr = str.trim();
        cleanStr = cleanStr.replace(/['"\\;]/g, (match) => `\\${match}`);
        return cleanStr;
    }

    async query(sql, params = []) {
        try {
            const [results] = await this.db.execute(sql, params);

            // تشخیص هوشمند بر اساس نوع داده خروجی درایور mysql2
            
            // ۱. اگر خروجی آرایه باشد (مربوط به SELECT, SHOW, DESCRIBE)
            if (Array.isArray(results)) {
                return results;
            }

            // ۲. اگر خروجی ResultSetHeader باشد (مربوط به INSERT, UPDATE, DELETE)
            if (results && typeof results === 'object') {
                // در صورتی که اینسرت انجام شده و آیدی تولید شده باشد
                if (results.insertId && results.insertId !== 0) {
                    return results.insertId;
                }
                // در غیر این صورت تعداد سطرهای تغییر یافته (Affected Rows) را برمی‌گرداند
                return results.affectedRows;
            }

            return results;
        } catch (error) {
            // لاگ کردن خطا برای مدیر فنی و پرتاب خطا برای لایه کنترلر
            console.error(`[Database Error] [SQL: ${sql}]: ${error.message}`);
            throw new Error('Database execution failed in core.');
        }
    }
    
    normalizePrice(value) {
        if (!value) return null;
        return Number(
            value
                .toString()
                .replace(/,/g, '')
                .replace(/٬/g, '')
                .replace(/[^\d.]/g, '')
        );
    }
    
}

module.exports = BaseModel;