// routes/admin/users.js — مُولّد من تقسيم admin.js الأصلي.
// كل وحدة Router مستقلة تُركّب على /api/admin عبر routes/admin.js.
const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const User = require('../../models/User');
const Order = require('../../models/Order');
const Settings = require('../../models/Settings');
const AdminLog = require('../../models/AdminLog');
const PromoCode = require('../../models/PromoCode');
const Rating = require('../../models/Rating');
const Banner = require('../../models/Banner');
const { protect, adminOnly, superAdminOnly, requirePermission } = require('../../middleware/authMiddleware');
const { logAdminAction } = require('../../utils/adminLogger');
const { normalizePhone } = require('../../utils/phoneNormalizer');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const rateLimit = require('express-rate-limit');
const logger = require('../../utils/logger');

const SessionRequest = require('../../models/SessionRequest');

router.get('/user/:id', protect, adminOnly, async (req, res) => {
    try {
        const user = await User.findById(req.params.id).select('-password');
        if (!user) {
            return res.status(404).json({ message: 'المستخدم غير موجود' });
        }
        res.json(user);
    } catch (error) {
        logger.error(error);
        res.status(500).json({ message: 'Server error' });
    }
});

// =========================================================
// 👥 الجزء الثاني: إدارة المستخدمين
// =========================================================

// @route   GET /api/admin/users
// @desc    جلب جميع المستخدمين (مع فلتر اختياري بالمدينة)
// 🌍 ?city=Khartoum | PortSudan (optional, no city = all cities)

router.get('/users', protect, adminOnly, async (req, res) => {
    try {
        const VALID_CITIES = ['Khartoum', 'PortSudan'];
        const cityFilter = VALID_CITIES.includes(req.query.city) ? { city: req.query.city } : {};
        const users = await User.find(cityFilter).select('-password').sort({ createdAt: -1 });
        res.json(users);
    } catch (error) {
        res.status(500).json({ message: 'Server error' });
    }
});

// @route   GET /api/admin/captains
// @desc    جلب الكباتن فقط (مع فلتر اختياري بالمدينة)
// 🌍 ?city=Khartoum | PortSudan (optional)

router.get('/captains', protect, adminOnly, async (req, res) => {
    try {
        const VALID_CITIES = ['Khartoum', 'PortSudan'];
        const cityFilter = VALID_CITIES.includes(req.query.city) ? { city: req.query.city } : {};
        const captains = await User.find({ role: 'captain', ...cityFilter }).select('-password');
        res.json(captains);
    } catch (error) {
        res.status(500).json({ message: 'Server error' });
    }
});

// @route   PUT /api/admin/user/:id/city
// @desc    Reassign a user (client or captain) to a different city.
//          Use this when a user registered with the wrong city or moved.
// 🌍 Body: { city: 'Khartoum' | 'PortSudan' }

router.put('/user/:id/city', protect, adminOnly, async (req, res) => {
    try {
        const VALID_CITIES = ['Khartoum', 'PortSudan'];
        const { city } = req.body;

        if (!VALID_CITIES.includes(city)) {
            return res.status(400).json({
                message: `مدينة غير صحيحة. القيم المقبولة: ${VALID_CITIES.join(', ')}`
            });
        }

        const user = await User.findById(req.params.id);
        if (!user) return res.status(404).json({ message: 'المستخدم غير موجود' });
        if (user.role === 'admin') return res.status(403).json({ message: 'لا يمكن تغيير مدينة حساب الأدمن' });

        const oldCity = user.city;
        user.city = city;
        await user.save();

        logger.info({ adminId: req.user._id, userId: user._id, from: oldCity, to: city }, 'Admin reassigned user city');

        res.json({
            message: `تم تغيير مدينة المستخدم من ${oldCity} إلى ${city} بنجاح`,
            user: { _id: user._id, name: user.name, role: user.role, city: user.city }
        });
    } catch (error) {
        logger.error({ err: error }, 'City reassignment error');
        res.status(500).json({ message: 'Server error' });
    }
});

// @desc    تفعيل أو تعطيل حساب مستخدم

router.put('/user/:id/status', protect, adminOnly, async (req, res) => {
    try {
        // حماية: منع الأدمن من تعطيل نفسه
        if (req.user._id.toString() === req.params.id) {
            return res.status(400).json({ message: 'لا يمكنك تعطيل حسابك الشخصي!' });
        }

        const user = await User.findById(req.params.id);

        if (!user) {
            return res.status(404).json({ message: 'المستخدم غير موجود' });
        }

        user.isActive = !user.isActive; // عكس الحالة الحالية
        await user.save();

        res.json({
            message: `تم ${user.isActive ? 'تفعيل' : 'تعطيل'} الحساب بنجاح`,
            isActive: user.isActive,
        });

    } catch (error) {
        logger.error(error);
        res.status(500).json({ message: 'Server error' });
    }
});

// =========================================================
// 📦 الجزء الثالث: الطلبات (سجل الطلبات الكامل)
// =========================================================

// @route   GET /api/admin/orders/live
// @desc    جلب الطلبات النشطة فقط (مع فلتر اختياري بالمدينة)
// 🌍 ?city=Khartoum | PortSudan (optional)

router.post('/create-captain', protect, adminOnly, async (req, res) => {
    try {
        const { name, email, phone, password, vehicleType, city } = req.body;

        // Validate city
        const VALID_CITIES = ['Khartoum', 'PortSudan'];
        const captainCity = VALID_CITIES.includes(city) ? city : 'Khartoum';

        // تنسيق رقم الهاتف
        const normalizedPhone = normalizePhone(phone);
        logger.info(`📞 Create Captain - Original: ${phone}, Normalized: ${normalizedPhone}, City: ${captainCity}`);

        // التحقق من وجود المستخدم مسبقاً
        const userExists = await User.findOne({ $or: [{ email }, { phone: normalizedPhone }] });
        if (userExists) {
            return res.status(400).json({ message: 'المستخدم موجود بالفعل (البريد أو الهاتف مسجل مسبقاً)' });
        }

        // إنشاء المستخدم
        const user = await User.create({
            name,
            email,
            phone: normalizedPhone,
            password,
            role: 'captain',
            vehicleType,
            city: captainCity,   // 🌍 City stamp
            isActive: true,
            isVerified: true,
            approvalStatus: 'approved'
        });

        if (user) {
            await logAdminAction(req, 'create_captain',
                `تم إضافة كابتن جديد: ${name}`,
                user._id, name, { phone: normalizedPhone, city: captainCity, vehicleType }
            );
            res.status(201).json({
                _id: user._id,
                name: user.name,
                email: user.email,
                role: user.role,
                city: user.city,
                message: `تم إنشاء حساب الكابتن بنجاح في مدينة ${captainCity}`
            });
        } else {
            res.status(400).json({ message: 'بيانات المستخدم غير صحيحة' });
        }

    } catch (error) {
        logger.error("Create Captain Error:", error);
        res.status(500).json({ message: 'حدث خطأ في السيرفر' });
    }
});

// @route   PUT /api/admin/orders/:id/cancel-force

router.get('/pending-captains', protect, adminOnly, async (req, res) => {
    try {
        const captains = await User.find({ role: 'captain', approvalStatus: 'pending' })
            .select('-password')
            .sort({ createdAt: -1 });
        res.json(captains);
    } catch (error) {
        res.status(500).json({ message: 'Server Error' });
    }
});

// @route   PUT /api/admin/approve-captain/:id

router.put('/approve-captain/:id', protect, adminOnly, async (req, res) => {
    try {
        const captain = await User.findById(req.params.id);
        if (!captain) return res.status(404).json({ message: 'الكابتن غير موجود' });
        if (captain.role !== 'captain') return res.status(400).json({ message: 'هذا المستخدم ليس كابتن' });

        captain.approvalStatus = 'approved';
        captain.isVerified = true;
        captain.isActive = true;
        await captain.save();

        await logAdminAction(req, 'approve_captain',
            `تم قبول الكابتن: ${captain.name}`,
            captain._id, captain.name
        );

        // Notify captain
        const { sendNotification } = require('../../utils/notificationHelper');
        await sendNotification(req.app, {
            userId: captain._id,
            title: '🎉 تمت الموافقة على طلبك!',
            message: 'تم قبولك ككابتن في وصل-لي. يمكنك الآن تسجيل الدخول والبدء في استقبال الطلبات!',
            type: 'system',
            relatedId: captain._id
        });

        res.json({ message: 'تمت الموافقة على الكابتن بنجاح', captain });
    } catch (error) {
        logger.error('Approve Error:', error);
        res.status(500).json({ message: 'Server Error' });
    }
});


// @route   PUT /api/admin/reject-captain/:id

router.put('/reject-captain/:id', protect, adminOnly, async (req, res) => {
    try {
        const { reason } = req.body;
        const captain = await User.findById(req.params.id);
        if (!captain) return res.status(404).json({ message: 'الكابتن غير موجود' });
        if (captain.role !== 'captain') return res.status(400).json({ message: 'هذا المستخدم ليس كابتن' });

        captain.approvalStatus = 'rejected';
        captain.rejectionReason = reason || 'لم يتم تحديد السبب';
        captain.isActive = false;
        await captain.save();

        await logAdminAction(req, 'reject_captain',
            `تم رفض طلب الكابتن: ${captain.name}`,
            captain._id, captain.name, { reason: captain.rejectionReason }
        );

        const { sendNotification } = require('../../utils/notificationHelper');
        await sendNotification(req.app, {
            userId: captain._id,
            title: '❌ تم رفض طلبك',
            message: `سبب الرفض: ${captain.rejectionReason}`,
            type: 'system',
            relatedId: captain._id
        });

        res.json({ message: 'تم رفض طلب الكابتن', captain });
    } catch (error) {
        logger.error('Reject Error:', error);
        res.status(500).json({ message: 'Server Error' });
    }
});


// =========================================================
// 📒 سجل الحركات المالية الشامل (Financial Ledger)
// =========================================================

// @route   GET /api/admin/ledger
// @desc    آخر 100 حركة مالية (عمولات الطلبات + تعديلات الديون)
// 🌍 ?city=Khartoum | PortSudan | all (اختياري)
// 📅 ?from=YYYY-MM-DD&to=YYYY-MM-DD (اختياري)

router.delete('/users/:id', protect, adminOnly, async (req, res) => {
    try {
        if (req.user._id.toString() === req.params.id) {
            return res.status(400).json({ message: 'لا يمكنك حذف حسابك الشخصي!' });
        }
        const user = await User.findByIdAndDelete(req.params.id);
        if (!user) return res.status(404).json({ message: 'المستخدم غير موجود' });
        res.json({ message: 'تم حذف المستخدم بنجاح' });
    } catch (error) {
        res.status(500).json({ message: 'Server Error' });
    }
});

// @route   PUT /api/admin/users/:id
// @desc    تعديل بيانات المستخدم شاملة

router.put('/users/:id', protect, adminOnly, async (req, res) => {
    try {
        const { name, email, phone, role, wallet, vehicleType } = req.body;
        const user = await User.findById(req.params.id);

        if (!user) return res.status(404).json({ message: 'المستخدم غير موجود' });

        // ⚠️ Safety: allow 'admin' role only — no other invalid roles
        const validRoles = ['client', 'captain', 'merchant', 'admin'];
        if (role !== undefined && !validRoles.includes(role)) {
            return res.status(400).json({ message: 'قيمة الدور غير صالحة' });
        }

        user.name   = name   || user.name;
        user.email  = email  || user.email;
        user.phone  = phone  || user.phone;
        user.role   = role   || user.role;
        
        if (req.body.city !== undefined) {
            user.city = req.body.city;
        }
        user.wallet = wallet !== undefined ? wallet : user.wallet;

        // 💳 Financial fields for manual admin control
        if (req.body.wallet_balance !== undefined) {
            const parsedBalance = Number(req.body.wallet_balance);
            if (!isNaN(parsedBalance)) user.wallet_balance = parsedBalance;
        }
        if (req.body.credit_limit !== undefined) {
            const parsedLimit = Number(req.body.credit_limit);
            if (!isNaN(parsedLimit)) user.credit_limit = parsedLimit;
        }
        if (req.body.is_blocked !== undefined) {
            user.is_blocked = Boolean(req.body.is_blocked);
        }

        if (role === 'captain' && vehicleType) {
            user.vehicleType = vehicleType;
        }

        // ✅ FIX: Set password directly — the pre('save') hook in User.js will hash it
        if (req.body.password) {
            user.password = req.body.password;
        }

        await user.save();
        
        const userObj = user.toObject();
        delete userObj.password;
        delete userObj.fcmToken;
        delete userObj.resetCode;
        delete userObj.verificationCode;
        
        res.json({ message: 'تم تحديث بيانات المستخدم بنجاح', user: userObj });
    } catch (error) {
        logger.error(error);
        res.status(500).json({ message: 'Server Error' });
    }
});

// @route   DELETE /api/admin/orders/:id
// @desc    حذف طلب نهائياً

router.get('/users/search', protect, adminOnly, async (req, res) => {
    try {
        const q = (req.query.q || '').trim();
        if (!q || q.length < 2) return res.json([]);

        const users = await User.find({
            $or: [
                { name: { $regex: q, $options: 'i' } },
                { phone: { $regex: q, $options: 'i' } }
            ],
            role: { $in: ['client', 'captain', 'merchant'] }
        })
        .select('name phone role fcmToken')
        .limit(10);

        res.json(users);
    } catch (err) {
        logger.error('User Search Error:', err);
        res.status(500).json({ message: 'Server error' });
    }
});

// @route   POST /api/admin/broadcast
// @desc    إرسال إشعار جماعي أو مخصص
// target: 'all' | 'clients' | 'captains' | 'merchants' | 'user'
// userId: required when target === 'user'

module.exports = router;
