import { Injectable, NotFoundException, ForbiddenException } from '@nestjs/common';
import { PrismaService } from '../../database/prisma.service';

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

  async getMyFamily(userId: string) {
    const membership = await this.prisma.familyMember.findFirst({
      where: { userId },
      include: {
        family: {
          include: {
            members: {
              include: {
                user: { select: { id: true, name: true, email: true, avatarUrl: true, role: true } },
                guardian: true,
                child: {
                  include: {
                    devices: { select: { id: true, name: true, os: true, isActive: true, lastSeenAt: true } },
                    timeWallet: true,
                  },
                },
              },
            },
          },
        },
      },
    });

    if (!membership) throw new NotFoundException('Família não encontrada');
    return membership.family;
  }

  async updateFamily(userId: string, data: { name?: string; timezone?: string }) {
    const membership = await this.prisma.familyMember.findFirst({
      where: { userId, isOwner: true },
    });
    if (!membership) throw new ForbiddenException('Apenas o dono da família pode editar');

    return this.prisma.family.update({
      where: { id: membership.familyId },
      data,
    });
  }

  async getDashboard(userId: string) {
    const family = await this.getMyFamily(userId);
    const children = family.members
      .filter((m) => m.child)
      .map((m) => m.child!);

    const childrenData = await Promise.all(
      children.map(async (child) => {
        const wallet = child.timeWallet;
        const todayAssignments = await this.prisma.missionAssignment.findMany({
          where: {
            childId: child.id,
            updatedAt: { gte: new Date(new Date().setHours(0, 0, 0, 0)) },
          },
          include: { mission: { select: { title: true, rewardMinutes: true } } },
        });

        const pendingRequests = await this.prisma.timeRequest.count({
          where: { childId: child.id, status: 'PENDING' },
        });

        return {
          id: child.id,
          name: family.members.find((m) => m.child?.id === child.id)?.user.name,
          avatarEmoji: child.avatarEmoji,
          autonomyLevel: child.autonomyLevel,
          wallet: wallet
            ? {
                balanceMinutes: wallet.balanceMinutes,
                usedMinutesToday: wallet.usedMinutesToday,
                dailyMaxMinutes: wallet.dailyMaxMinutes,
                earnedConditionalToday: wallet.earnedConditionalToday,
                dailyConditionalMinutes: wallet.dailyConditionalMinutes,
              }
            : null,
          todayMissions: todayAssignments.length,
          pendingRequests,
          deviceCount: child.devices.filter((d) => d.isActive).length,
        };
      }),
    );

    return {
      family: { id: family.id, name: family.name },
      children: childrenData,
    };
  }
}
