const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
    // المعلومات الأساسية
    name: {
        type: String,
        required: [true, 'الاسم مطلوب'],
        trim: true
    },
    email: {
        type: String,
        required: [true, 'البريد الإلكتروني مطلوب'],
        unique: true,
        lowercase: true,
        match: [/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/, 'البريد الإلكتروني غير صحيح']
    },
    password: {
        type: String,
        required: [true, 'كلمة المرور مطلوبة'],
        minlength: [6, 'كلمة المرور يجب أن تكون 6 أحرف على الأقل']
    },
    phone: {
        type: String,
        required: [true, 'رقم الهاتف مطلوب']
    },
    
    // الصلاحيات والدور
    role: {
        type: String,
        enum: ['admin', 'supervisor', 'inspector', 'client', 'technician', 'coordinator'],
        default: 'client'
    },
    permissions: [{
        type: String,
        enum: [
            'view_dashboard',
            'manage_users',
            'manage_inspections',
            'manage_requests',
            'view_reports',
            'manage_payments',
            'manage_contracts',
            'manage_vehicles',
            'assign_tasks',
            'view_analytics'
        ]
    }],
    
    // حالة الحساب
    isActive: {
        type: Boolean,
        default: true
    },
    isEmailVerified: {
        type: Boolean,
        default: false
    },
    isPhoneVerified: {
        type: Boolean,
        default: false
    },
    
    // توكنات المصادقة
    tokens: [{
        token: String,
        device: String,
        createdAt: {
            type: Date,
            default: Date.now,
            expires: '30d' // تنتهي بعد 30 يوم
        }
    }],
    
    // توكن إعادة تعيين كلمة المرور
    resetPasswordToken: String,
    resetPasswordExpires: Date,
    
    // توكن تأكيد البريد الإلكتروني
    emailVerificationToken: String,
    
    // توكن تأكيد رقم الهاتف
    phoneVerificationToken: String,
    phoneVerificationExpires: Date,
    
    // آخر دخول
    lastLogin: Date,
    lastLoginIP: String,
    
    // معلومات إضافية حسب الدور
    profile: {
        avatar: String,
        address: String,
        city: String,
        country: String,
        birthDate: Date,
        nationalId: String
    },
    
    // للفاحصين
    inspectorDetails: {
        licenseNumber: String,
        licenseExpiry: Date,
        specialization: [String],
        supervisor: {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'User'
        },
        workingAreas: [String],
        maxDailyInspections: {
            type: Number,
            default: 10
        }
    },
    
    // للعملاء
    clientDetails: {
        companyName: String,
        companyRegNumber: String,
        taxNumber: String,
        accountType: {
            type: String,
            enum: ['individual', 'company'],
            default: 'individual'
        },
        vehicles: [{
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Vehicle'
        }]
    },
    
    // للمشرفين
    supervisorDetails: {
        department: String,
        managedInspectors: [{
            type: mongoose.Schema.Types.ObjectId,
            ref: 'User'
        }],
        region: String
    },
    
    // إعدادات المستخدم
    settings: {
        language: {
            type: String,
            enum: ['ar', 'en'],
            default: 'ar'
        },
        theme: {
            type: String,
            enum: ['light', 'dark'],
            default: 'light'
        },
        notifications: {
            email: {
                type: Boolean,
                default: true
            },
            sms: {
                type: Boolean,
                default: true
            },
            push: {
                type: Boolean,
                default: true
            }
        }
    }
}, {
    timestamps: true
});

// تشفير كلمة المرور قبل الحفظ
userSchema.pre('save', async function(next) {
    if (!this.isModified('password')) return next();
    
    const bcrypt = require('bcryptjs');
    const salt = await bcrypt.genSalt(10);
    this.password = await bcrypt.hash(this.password, salt);
    next();
});

// مقارنة كلمة المرور
userSchema.methods.comparePassword = async function(password) {
    const bcrypt = require('bcryptjs');
    return await bcrypt.compare(password, this.password);
};

// إنشاء توكن JWT
userSchema.methods.generateAuthToken = function() {
    const jwt = require('jsonwebtoken');
    return jwt.sign(
        { 
            id: this._id,
            email: this.email,
            role: this.role,
            permissions: this.permissions
        },
        process.env.JWT_SECRET,
        { expiresIn: process.env.JWT_EXPIRE || '7d' }
    );
};

// حذف المعلومات الحساسة عند إرجاع المستخدم
userSchema.methods.toJSON = function() {
    const user = this.toObject();
    delete user.password;
    delete user.tokens;
    delete user.resetPasswordToken;
    delete user.resetPasswordExpires;
    delete user.emailVerificationToken;
    delete user.phoneVerificationToken;
    delete user.phoneVerificationExpires;
    return user;
};

module.exports = mongoose.model('User', userSchema);