import { Injectable } from '@nestjs/common';
import { BusinessException } from '@common/exceptions/business.exception';
import { ReleaseNotesRepository } from '../repositories/release-notes.repository';
import { Prisma } from '@prisma/client';
import { DEVTRACKER_ERROR_CODES } from '../constants/error-codes';

@Injectable()
export class ReleaseNotesService {
  constructor(private readonly repository: ReleaseNotesRepository) {}

  async findAll(query: { page?: number; pageSize?: number; keyword?: string }) {
    const { page = 1, pageSize = 20 } = query;
    const result = await this.repository.findMany({
      page,
      pageSize,
      keyword: query.keyword,
    });

    return {
      items: result.items,
      pagination: {
        page,
        pageSize,
        total: result.total,
        totalPages: Math.ceil(result.total / pageSize),
      },
    };
  }

  async create(payload: {
    version: string;
    title: string;
    content?: Record<string, unknown>;
    releasedAt: string;
    createdBy: string;
  }) {
    const existed = await this.repository.findByVersion(payload.version);
    if (existed) {
      throw new BusinessException(
        DEVTRACKER_ERROR_CODES.RELEASE_NOTE_CONFLICT.message,
        DEVTRACKER_ERROR_CODES.RELEASE_NOTE_CONFLICT.code,
        DEVTRACKER_ERROR_CODES.RELEASE_NOTE_CONFLICT.httpStatus,
      );
    }

    return this.repository.create({
      version: payload.version.trim(),
      title: payload.title.trim(),
      content: payload.content ? (payload.content as Prisma.InputJsonValue) : undefined,
      releasedAt: new Date(payload.releasedAt),
      createdBy: payload.createdBy,
    });
  }
}
