import { GraphQLError } from 'graphql'

import { prisma } from '../../../lib/prisma'
import { Context } from '../../context'
import { DomainResolvers } from '../shared/types'

// Catalog Domain Resolvers - изолированная логика каталога и категорий
export const catalogResolvers: DomainResolvers = {
  Query: {
    // Получение всех категорий
    categories: async (_: unknown, __: unknown, context: Context) => {
      if (!context.user) {
        throw new GraphQLError('Требуется авторизация', {
          extensions: { code: 'UNAUTHENTICATED' },
        })
      }

      const categories = await prisma.category.findMany({
        orderBy: {
          name: 'asc',
        },
      })

      return categories
    },
  },

  Mutation: {
    // Создание категории (только админы)
    createCategory: async (
      _: unknown,
      args: { name: string; description?: string },
      context: Context,
    ) => {
      if (!context.admin) {
        throw new GraphQLError('Доступ разрешен только администраторам', {
          extensions: { code: 'FORBIDDEN' },
        })
      }

      const category = await prisma.category.create({
        data: {
          name: args.name,
          description: args.description,
        },
      })

      return category
    },

    // Обновление категории (только админы)
    updateCategory: async (
      _: unknown,
      args: { id: string; name?: string; description?: string },
      context: Context,
    ) => {
      if (!context.admin) {
        throw new GraphQLError('Доступ разрешен только администраторам', {
          extensions: { code: 'FORBIDDEN' },
        })
      }

      const category = await prisma.category.update({
        where: { id: args.id },
        data: {
          name: args.name,
          description: args.description,
        },
      })

      return category
    },

    // Удаление категории (только админы)
    deleteCategory: async (_: unknown, args: { id: string }, context: Context) => {
      if (!context.admin) {
        throw new GraphQLError('Доступ разрешен только администраторам', {
          extensions: { code: 'FORBIDDEN' },
        })
      }

      // Проверяем, есть ли товары в этой категории
      const productsCount = await prisma.product.count({
        where: { categoryId: args.id },
      })

      if (productsCount > 0) {
        throw new GraphQLError(
          `Невозможно удалить категорию. В ней содержится ${productsCount} товар(ов)`,
        )
      }

      await prisma.category.delete({
        where: { id: args.id },
      })

      return true
    },
  },
}