import { Injectable } from '@nestjs/common';
import { NotificationCategory, Prisma } from '@prisma/client';
import { PrismaService } from '../../prisma/prisma.service';

const ALL_CATEGORIES: NotificationCategory[] = [
  NotificationCategory.URGENT,
  NotificationCategory.PAYMENTS,
  NotificationCategory.ANNOUNCEMENTS,
  NotificationCategory.MARKETING,
];

const DEFAULTS: Record<NotificationCategory, {
  push: boolean; email: boolean; sms: boolean; whatsapp: boolean;
}> = {
  URGENT: { push: true, email: true, sms: false, whatsapp: false },
  PAYMENTS: { push: true, email: true, sms: false, whatsapp: false },
  ANNOUNCEMENTS: { push: true, email: true, sms: false, whatsapp: false },
  MARKETING: { push: false, email: true, sms: false, whatsapp: false },
};

export interface UpdatePreferenceInput {
  category: NotificationCategory;
  push?: boolean;
  email?: boolean;
  sms?: boolean;
  whatsapp?: boolean;
  /** Minute du jour [0..1439]. null pour désactiver. */
  quietHoursStart?: number | null;
  quietHoursEnd?: number | null;
}

@Injectable()
export class NotificationPreferencesService {
  constructor(private readonly prisma: PrismaService) {}

  /**
   * Retourne les préférences de l'utilisateur, en complétant avec les valeurs
   * par défaut pour les catégories absentes en base.
   */
  async listForUser(userId: string) {
    const stored = await this.prisma.notificationPreference.findMany({ where: { userId } });
    const byCategory = new Map(stored.map((p) => [p.category, p]));
    return ALL_CATEGORIES.map((cat) => {
      const existing = byCategory.get(cat);
      if (existing) return existing;
      const defaults = DEFAULTS[cat];
      return {
        id: null,
        userId,
        category: cat,
        ...defaults,
        quietHoursStart: null,
        quietHoursEnd: null,
        updatedAt: null,
      };
    });
  }

  async upsert(userId: string, input: UpdatePreferenceInput) {
    const defaults = DEFAULTS[input.category];
    const data: Prisma.NotificationPreferenceUncheckedCreateInput = {
      userId,
      category: input.category,
      push: input.push ?? defaults.push,
      email: input.email ?? defaults.email,
      sms: false,
      whatsapp: false,
      quietHoursStart: input.quietHoursStart ?? null,
      quietHoursEnd: input.quietHoursEnd ?? null,
    };
    return this.prisma.notificationPreference.upsert({
      where: { userId_category: { userId, category: input.category } },
      create: data,
      update: {
        push: data.push,
        email: data.email,
        sms: data.sms,
        whatsapp: data.whatsapp,
        quietHoursStart: data.quietHoursStart,
        quietHoursEnd: data.quietHoursEnd,
      },
    });
  }
}
