import { User } from '../models/entities/User.entity';
import { env } from '../config/env';
import { ProfileEnhancementService } from '../services/ProfileEnhancementService';
import {
  isPasswordExpired,
  passwordAgeDays,
  PASSWORD_MAX_AGE_DAYS,
} from '../utils/passwordPolicy';

const profileEnhancement = new ProfileEnhancementService();

function passwordSecurity(user: User) {
  const ageDays = passwordAgeDays(user.passwordChangedAt);
  const expired = Boolean(user.passwordHash) && isPasswordExpired(user.passwordChangedAt);
  return {
    authProvider: user.authProvider,
    hasPassword: Boolean(user.passwordHash),
    mustChangePassword: Boolean(user.mustChangePassword),
    passwordExpired: expired,
    passwordAgeDays: ageDays,
    passwordMaxAgeDays: PASSWORD_MAX_AGE_DAYS,
  };
}

export class UserView {
  static toPublic(user: User) {
    const displayHeadline = profileEnhancement.buildDisplayHeadline(
      user.jobTitle,
      user.company,
      user.headline,
    );

    return {
      id: user.id,
      email: user.email,
      fullName: user.fullName,
      username: user.username,
      timezone: user.timezone,
      avatarUrl: user.avatarUrl,
      bannerUrl: user.bannerUrl,
      logoUrl: user.logoUrl,
      tagline: user.tagline,
      headline: user.headline,
      displayHeadline,
      bio: user.bio,
      jobTitle: user.jobTitle,
      company: user.company,
      location: user.location,
      linkedinUrl: user.linkedinUrl,
      emailVerified: Boolean(user.emailVerified),
      createdAt: user.createdAt.toISOString(),
      publicBookingBaseUrl: `${env.bookingAppUrl}/book/${encodeURIComponent(user.username)}`,
      publicProfileUrl: `${env.bookingAppUrl}/book/${encodeURIComponent(user.username)}`,
      ...passwordSecurity(user),
    };
  }

  static toAuthUser(user: User) {
    return {
      id: user.id,
      email: user.email,
      username: user.username,
      timezone: user.timezone,
      ...passwordSecurity(user),
    };
  }

  static toRegisterResponse(user: User, passwordEmailed: boolean) {
    return {
      id: user.id,
      email: user.email,
      fullName: user.fullName,
      username: user.username,
      timezone: user.timezone,
      emailVerified: Boolean(user.emailVerified),
      passwordEmailed,
      message: passwordEmailed
        ? 'Account created. Check your email for your sign-in password.'
        : 'Account created successfully.',
    };
  }
}
