import {
  Injectable,
  NotFoundException,
} from '@nestjs/common';
import { PrismaService } from '../../prisma/prisma.service';
import { CreateAttachmentDto } from './dto/create-attachment.dto';
import { UpdateAttachmentDto } from './dto/update-attachment.dto';

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

  async create(createAttachmentDto: CreateAttachmentDto, creatorId?: number) {
    // 验证活动是否存在
    const contest = await this.prisma.contest.findUnique({
      where: { id: createAttachmentDto.contestId },
    });

    if (!contest) {
      throw new NotFoundException('活动不存在');
    }

    const data: any = {
      ...createAttachmentDto,
      size: createAttachmentDto.size || '0',
    };

    if (creatorId) {
      data.creator = creatorId;
    }

    return this.prisma.contestAttachment.create({
      data,
      include: {
        contest: true,
      },
    });
  }

  async findAll(contestId: number) {
    return this.prisma.contestAttachment.findMany({
      where: {
        contestId,
        validState: 1,
      },
      orderBy: {
        createTime: 'desc',
      },
      include: {
        contest: {
          select: {
            id: true,
            contestName: true,
          },
        },
      },
    });
  }

  async findOne(id: number) {
    const attachment = await this.prisma.contestAttachment.findFirst({
      where: {
        id,
        validState: 1,
      },
      include: {
        contest: true,
      },
    });

    if (!attachment) {
      throw new NotFoundException('附件不存在');
    }

    return attachment;
  }

  async update(id: number, updateAttachmentDto: UpdateAttachmentDto, modifierId?: number) {
    const attachment = await this.findOne(id);

    const data: any = { ...updateAttachmentDto };

    if (modifierId) {
      data.modifier = modifierId;
    }

    return this.prisma.contestAttachment.update({
      where: { id },
      data,
      include: {
        contest: true,
      },
    });
  }

  async remove(id: number) {
    await this.findOne(id);

    // 软删除
    return this.prisma.contestAttachment.update({
      where: { id },
      data: {
        validState: 2,
      },
    });
  }
}

