import { PrismaClient, UserProfile } from '@prisma/client';

import { getPrismaClient } from '../config/database.config';
import { BaseRepository } from '../modules/common/repository';

/**
 * EN: User Profile repository for database operations
 * VI: Repository profile người dùng cho các thao tác database
 */
export class UserProfileRepository extends BaseRepository<UserProfile, any, any> {
  constructor(prisma?: PrismaClient) {
    super(prisma || getPrismaClient(), 'userProfile');
  }

  /**
   * EN: Find profile by user ID
   * VI: Tìm profile theo user ID
   */
  async findByUserId(userId: string): Promise<UserProfile | null> {
    return this.prisma.userProfile.findUnique({
      where: { userId },
      include: {
        user: {
          select: {
            id: true,
            email: true,
            username: true,
            isActive: true,
          },
        },
      },
    });
  }

  /**
   * EN: Create or update profile for user
   * VI: Tạo hoặc cập nhật profile cho user
   */
  async upsert(userId: string, data: any): Promise<UserProfile> {
    return this.prisma.userProfile.upsert({
      where: { userId },
      update: {
        ...data,
        updatedAt: new Date(),
      },
      create: {
        userId,
        ...data,
      },
      include: {
        user: {
          select: {
            id: true,
            email: true,
            username: true,
          },
        },
      },
    });
  }

  /**
   * EN: Update avatar URL
   * VI: Cập nhật URL avatar
   */
  async updateAvatar(userId: string, avatarUrl: string): Promise<UserProfile> {
    return this.prisma.userProfile.update({
      where: { userId },
      data: {
        avatarUrl,
        updatedAt: new Date(),
      },
    });
  }

  /**
   * EN: Remove avatar
   * VI: Xóa avatar
   */
  async removeAvatar(userId: string): Promise<UserProfile> {
    return this.prisma.userProfile.update({
      where: { userId },
      data: {
        avatarUrl: null,
        updatedAt: new Date(),
      },
    });
  }

  /**
   * EN: Update phone verification status
   * VI: Cập nhật trạng thái xác thực điện thoại
   */
  async verifyPhone(userId: string): Promise<UserProfile> {
    return this.prisma.userProfile.update({
      where: { userId },
      data: {
        phoneVerified: true,
        updatedAt: new Date(),
      },
    });
  }

  /**
   * EN: Find profile by phone
   * VI: Tìm profile theo số điện thoại
   */
  async findByPhone(phone: string): Promise<UserProfile | null> {
    return this.prisma.userProfile.findFirst({
      where: { phone },
      include: {
        user: {
          select: {
            id: true,
            email: true,
            username: true,
            isActive: true,
          },
        },
      },
    });
  }
}
