const db = require('../database/database');
const argon2 = require('argon2');
const jwt = require('jsonwebtoken');

class User {
  constructor(id, email, password, userType, createdAt, updatedAt, role) {
    this.id = id;
    this.email = email;
    this.password = password;
    this.userType = userType; // 'personal' or 'company'
    this.createdAt = createdAt;
    this.updatedAt = updatedAt;
    this.role = role; // Add role property
  }

  // Hash password
  static async hashPassword(password) {
    console.log('🔐 Hashing password with Argon2...');
    return await argon2.hash(password, {
      type: argon2.argon2i,
      memoryCost: 2 ** 16, // 64 MB
      timeCost: 3,
      parallelism: 1,
    });
  }

  // Compare password
  async comparePassword(password) {
    console.log('🔍 Comparing password with Argon2...');
    return await argon2.verify(this.password, password);
  }

  // Generate JWT token
  generateToken() {
    console.log('🎫 Generating JWT token for user:', this.id);
    return jwt.sign(
      { 
        userId: this.id, 
        email: this.email, 
        userType: this.userType 
      },
      process.env.JWT_SECRET,
      { expiresIn: process.env.JWT_EXPIRES_IN }
    );
  }

  // Verify JWT token
  static verifyToken(token) {
    try {
      return jwt.verify(token, process.env.JWT_SECRET);
    } catch (error) {
      console.error('💥 Token verification failed:', error.message);
      return null;
    }
  }

  // Get user basic info (without password)
  getPublicData() {
    const { password, ...publicData } = this;
    return publicData;
  }
}

module.exports = User;
