const nocodbService = require('../services/nocodb');
const logger = require('../utils/logger');
const config = require('../config');
const { sanitizeUser, extractId } = require('../utils/helpers');

class UsersController {
    async getAll(req, res) {
        try {
            // Debug logging
            logger.info('UsersController.getAll called');
            logger.info('loginSheetId from config:', config.nocodb.loginSheetId);
            logger.info('NocoDB config:', {
                apiUrl: config.nocodb.apiUrl,
                hasToken: !!config.nocodb.apiToken,
                projectId: config.nocodb.projectId,
                tableId: config.nocodb.tableId,
                loginSheetId: config.nocodb.loginSheetId
            });
            
            if (!config.nocodb.loginSheetId) {
                logger.error('Login sheet not configured in environment');
                return res.status(500).json({
                    success: false,
                    error: 'Login sheet not configured. Please set NOCODB_LOGIN_SHEET in your environment variables.'
                });
            }
            
            logger.info('Fetching users from NocoDB...');
            // Remove the sort parameter that's causing the error
            const response = await nocodbService.getAll(config.nocodb.loginSheetId, {
                limit: 100
                // Removed: sort: '-created_at'
            });
            
            const users = response.list || [];
            logger.info(`Retrieved ${users.length} users from database`);
            
            // Remove password field from response for security
            const safeUsers = users.map(sanitizeUser);
            
            res.json({
                success: true,
                users: safeUsers
            });
            
        } catch (error) {
            logger.error('Error fetching users:', error);
            res.status(500).json({
                success: false,
                error: 'Failed to fetch users: ' + error.message
            });
        }
    }
    
    async create(req, res) {
        try {
            const { email, password, name, admin } = req.body;
            
            if (!email || !password) {
                return res.status(400).json({
                    success: false,
                    error: 'Email and password are required'
                });
            }
            
            if (!config.nocodb.loginSheetId) {
                return res.status(500).json({
                    success: false,
                    error: 'Login sheet not configured'
                });
            }
            
            // Check if user already exists
            const existingUser = await nocodbService.getUserByEmail(email);
            
            if (existingUser) {
                return res.status(400).json({
                    success: false,
                    error: 'User with this email already exists'
                });
            }
            
            // Create new user - use the actual column names from your table
            const userData = {
                Email: email,
                email: email,
                Password: password,
                password: password,
                Name: name || '',
                name: name || '',
                Admin: admin === true,
                admin: admin === true
                // Removed created_at fields as they might not exist
            };
            
            const response = await nocodbService.create(
                config.nocodb.loginSheetId,
                userData
            );
            
            res.status(201).json({
                success: true,
                message: 'User created successfully',
                user: {
                    id: extractId(response),
                    email: email,
                    name: name,
                    admin: admin
                }
            });
            
        } catch (error) {
            logger.error('Error creating user:', error);
            res.status(500).json({
                success: false,
                error: 'Failed to create user'
            });
        }
    }
    
    async delete(req, res) {
        try {
            const userId = req.params.id;
            
            if (!config.nocodb.loginSheetId) {
                return res.status(500).json({
                    success: false,
                    error: 'Login sheet not configured'
                });
            }
            
            // Don't allow admins to delete themselves
            if (userId === req.session.userId) {
                return res.status(400).json({
                    success: false,
                    error: 'Cannot delete your own account'
                });
            }
            
            await nocodbService.delete(
                config.nocodb.loginSheetId,
                userId
            );
            
            res.json({
                success: true,
                message: 'User deleted successfully'
            });
            
        } catch (error) {
            logger.error('Error deleting user:', error);
            res.status(500).json({
                success: false,
                error: 'Failed to delete user'
            });
        }
    }
}

module.exports = new UsersController();