const { getDatabase } = require('../config/database');

class AuditLog {
    /**
     * Create an audit log entry
     */
    static create(logData) {
        const db = getDatabase();
        const stmt = db.prepare(`
            INSERT INTO audit_log (
                user_id,
                action,
                entity_type,
                entity_id,
                old_value,
                new_value,
                ip_address
            ) VALUES (?, ?, ?, ?, ?, ?, ?)
        `);

        const result = stmt.run(
            logData.user_id,
            logData.action,
            logData.entity_type,
            logData.entity_id,
            logData.old_value ? JSON.stringify(logData.old_value) : null,
            logData.new_value ? JSON.stringify(logData.new_value) : null,
            logData.ip_address || null
        );

        return result.lastInsertRowid;
    }

    /**
     * Get all audit logs with pagination
     */
    static getAll(limit = 100, offset = 0) {
        const db = getDatabase();
        const stmt = db.prepare(`
            SELECT
                al.*,
                u.username,
                u.email
            FROM audit_log al
            LEFT JOIN users u ON al.user_id = u.id
            ORDER BY al.created_at DESC
            LIMIT ? OFFSET ?
        `);
        return stmt.all(limit, offset);
    }

    /**
     * Get audit logs for a specific user
     */
    static getByUserId(userId, limit = 100, offset = 0) {
        const db = getDatabase();
        const stmt = db.prepare(`
            SELECT
                al.*,
                u.username,
                u.email
            FROM audit_log al
            LEFT JOIN users u ON al.user_id = u.id
            WHERE al.user_id = ?
            ORDER BY al.created_at DESC
            LIMIT ? OFFSET ?
        `);
        return stmt.all(userId, limit, offset);
    }

    /**
     * Get audit logs for a specific entity
     */
    static getByEntity(entityType, entityId, limit = 100, offset = 0) {
        const db = getDatabase();
        const stmt = db.prepare(`
            SELECT
                al.*,
                u.username,
                u.email
            FROM audit_log al
            LEFT JOIN users u ON al.user_id = u.id
            WHERE al.entity_type = ? AND al.entity_id = ?
            ORDER BY al.created_at DESC
            LIMIT ? OFFSET ?
        `);
        return stmt.all(entityType, entityId, limit, offset);
    }

    /**
     * Get recent audit logs
     */
    static getRecent(limit = 10) {
        const db = getDatabase();
        const stmt = db.prepare(`
            SELECT
                al.*,
                u.username,
                u.email
            FROM audit_log al
            LEFT JOIN users u ON al.user_id = u.id
            ORDER BY al.created_at DESC
            LIMIT ?
        `);
        return stmt.all(limit);
    }

    /**
     * Helper method to log user actions
     */
    static logUserAction(userId, action, entityType, entityId, oldValue = null, newValue = null, ipAddress = null) {
        return this.create({
            user_id: userId,
            action,
            entity_type: entityType,
            entity_id: entityId,
            old_value: oldValue,
            new_value: newValue,
            ip_address: ipAddress
        });
    }
}

module.exports = AuditLog;
