const SystemConfig = require('../models/systemConfig.model');

class SystemConfigService {
    /**
     * Lấy config hiện tại (chỉ có 1 document duy nhất)
     * Nếu chưa có thì tạo mới với giá trị từ .env (+ website model nếu có)
     */
    async getConfig() {
        let config = await SystemConfig.findOne();
        if (!config) {
            // Khởi tạo từ .env lần đầu
            config = await SystemConfig.create({
                emailUser: process.env.EMAIL_USER || '',
                emailClientId: process.env.CLIENT_ID || '',
                emailClientSecret: process.env.CLIENT_SECRET || '',
                emailRedirectUri: process.env.REDIRECT_URI || 'https://developers.google.com/oauthplayground',
                emailRefreshToken: process.env.REFRESH_TOKEN || '',
                sepayId: process.env.SEPAY_ID_SANBOX || '',
                sepaySecret: process.env.SEPAY_SECRET_SANBOX || '',
                cloudinaryName: process.env.CLOUD_DINARY_NAME || '',
                cloudinaryKey: process.env.CLOUD_DINARY_KEY || '',
                cloudinarySecret: process.env.CLOUD_DINARY_SECRET || '',
                tsrPartnerId: process.env.PARTNER_ID_TST || '',
                tsrPartnerKey: process.env.PARTNER_KEY_TST || '',
                tsrUrl: process.env.URL_TSR || 'https://thesieure.com/chargingws/v2',
            });
        }
        return config;
    }

    /**
     * Cập nhật config — chỉ update các field được gửi lên
     * Các field password/secret rỗng → giữ nguyên giá trị cũ
     */
    async updateConfig(data) {
        let config = await SystemConfig.findOne();
        if (!config) {
            config = await SystemConfig.create(data);
            return config;
        }

        // Với các trường nhạy cảm: nếu gửi lên rỗng thì GIỮ NGUYÊN giá trị cũ
        const sensitiveFields = [
            'emailClientSecret',
            'emailRefreshToken',
            'sepaySecret',
            'cloudinarySecret',
            'tsrPartnerKey',
        ];

        const updateData = { ...data };
        sensitiveFields.forEach((field) => {
            if (!updateData[field] || updateData[field].trim() === '') {
                delete updateData[field]; // không ghi đè nếu rỗng
            }
        });

        return await SystemConfig.findOneAndUpdate({ _id: config._id }, updateData, { new: true });
    }

    /**
     * Lấy config để hiển thị cho admin (giá trị thật, route đã bảo vệ bằng authAdmin)
     */
    async getConfigForAdmin() {
        const config = await this.getConfig();
        return config.toObject();
    }
}

module.exports = new SystemConfigService();
