
import { Request, Response } from 'express';
import { createLog } from './logs.controller';
import { SystemSettings } from '../models/SystemSettings';

export const getSettings = async (req: Request, res: Response) => {
    try {
        // Get the most recent settings document (in case of duplicates)
        let settings = await SystemSettings.findOne().sort({ createdAt: -1 });

        if (!settings) {
            // Create default settings if not exists
            settings = await SystemSettings.create({});
        } else {
            // If there are multiple documents, clean up duplicates (keep only the most recent)
            const count = await SystemSettings.countDocuments();
            if (count > 1) {
                // Delete all except the most recent one
                await SystemSettings.deleteMany({ _id: { $ne: settings._id } });
            }
        }

        res.json({ success: true, data: settings });
    } catch (error: any) {
        res.status(500).json({ success: false, message: error.message });
    }
};

export const updateSettings = async (req: Request, res: Response) => {
    try {
        const updateData = req.body;

        // Find the first (or most recent) settings document
        // Sort by createdAt descending to get the most recent one
        let existingSettings = await SystemSettings.findOne().sort({ createdAt: -1 });

        let settings;
        if (existingSettings) {
            // Update existing document by _id to avoid creating duplicates
            settings = await SystemSettings.findByIdAndUpdate(
                existingSettings._id,
                updateData,
                { new: true, runValidators: true }
            );

            // If there are multiple documents, delete the duplicates (keep only the updated one)
            await SystemSettings.deleteMany({ _id: { $ne: existingSettings._id } });
        } else {
            // Create new document only if none exists
            settings = await SystemSettings.create(updateData);
        }

        // Record audit log
        await createLog({
            userId: (req as any).user?._id || 'system',
            action: 'SYSTEM_CONFIG',
            targetCollection: 'SystemSettings',
            details: 'Cập nhật cấu hình hệ thống',
            ipAddress: req.ip,
            userAgent: req.get('User-Agent')
        });

        res.json({ success: true, message: 'Settings updated successfully', data: settings });
    } catch (error: any) {
        res.status(500).json({ success: false, message: error.message });
    }
};

export const sendTestEmail = async (req: Request, res: Response) => {
    try {
        const { to } = req.body;
        if (!to) {
            return res.status(400).json({ success: false, message: 'Recipient email is required' });
        }

        // Simulate email sending
        // In real app, use nodemailer with settings from DB
        const settings = await SystemSettings.findOne().sort({ createdAt: -1 });
        // const transporter = nodemailer.createTransport(settings.smtp); ...

        // Mock success
        await new Promise(resolve => setTimeout(resolve, 1000));

        res.json({ success: true, message: `Test email sent to ${to}` });
    } catch (error: any) {
        res.status(500).json({ success: false, message: error.message });
    }
};
