import { PrismaClient } from '@prisma/client';
import { logger } from '../config/logger';

const prisma = new PrismaClient();


export const galleryService = {
  createImage: async (data: {
    url: string;
    caption: string;
    alt: string;
    width: number;
    height: number;
    size: number;
    format: string;
    articleId: string;
    order?: number;
  }) => {
    try {
      // Находим максимальное значение order для данного articleId
      const maxOrder = await prisma.galleryImage.aggregate({
        where: { articleId: data.articleId },
        _max: { order: true },
      });

      // Устанавливаем order как максимальное значение + 1, или 0 если записей еще нет
      const newOrder = maxOrder._max.order !== null ? maxOrder._max.order + 1 : 0;

      const image = await prisma.galleryImage.create({
        data: {
          ...data,
          order: newOrder
        }
      });
      logger.info(`Создано изображение в галерее: ${image.id}`);
      return image;
    } catch (error) {
      logger.error('Сбой создания изображения в галерее:', error);
      throw error;
    }
  },

  updateImage: async (
    id: string,
    data: {
      caption?: string;
      alt?: string;
      order?: number;
    }
  ) => {
    try {
      const image = await prisma.galleryImage.update({
        where: { id },
        data
      });
      logger.info(`Изменено изображение в галерее: ${id}`);
      return image;
    } catch (error) {
      logger.error(`Сбой изменения изображения в галерее: ${id}:`, error);
      throw error;
    }
  },

  deleteImage: async (id: string) => {
    try {
      await prisma.galleryImage.delete({
        where: { id }
      });
      logger.info(`Удалено изображение из галереи: ${id}`);
    } catch (error) {
      logger.error(`Сбой удаления изображения из галереи ${id}:`, error);
      throw error;
    }
  },

  reorderImages: async (articleId: string, imageIds: string[]) => {
    try {
      await prisma.$transaction(
        imageIds.map((id, index) =>
          prisma.galleryImage.update({
            where: { id },
            data: { order: index }
          })
        )
      );
      logger.info(`Изменен порядок расположения изображений в галерее для статьи: ${articleId}`);
    } catch (error) {
      logger.error(`Сбой изменения порядка расположения изображений в галерее для статьи ${articleId}:`, error);
      throw error;
    }
  },

  getArticleGallery: async (articleId: string) => {
    try {
      return await prisma.galleryImage.findMany({
        where: {articleId},
        orderBy: {order: 'asc'}
      });
    } catch (error) {
      logger.error(`Ошибка получения изображений галереи для статьи: ${articleId}:`, error);
      throw error;
    }
  }
};