import { resolvers as oldResolvers } from '../resolvers'
import { JSONScalar, DateTimeScalar } from '../scalars'

import { authResolvers } from './auth'
import { employeeResolvers } from './employees'
import { logisticsResolvers } from './logistics'
import { suppliesResolvers } from './supplies'

// Типы для резолверов
interface ResolverObject {
  Query?: Record<string, unknown>
  Mutation?: Record<string, unknown>
  [key: string]: unknown
}

// Функция для объединения резолверов
const mergeResolvers = (...resolvers: ResolverObject[]): ResolverObject => {
  const result: ResolverObject = {
    Query: {},
    Mutation: {},
  }

  for (const resolver of resolvers) {
    if (resolver?.Query) {
      Object.assign(result.Query, resolver.Query)
    }
    if (resolver?.Mutation) {
      Object.assign(result.Mutation, resolver.Mutation)
    }
    // Объединяем другие типы резолверов (например, Employee, Organization и т.д.)
    for (const [key, value] of Object.entries(resolver)) {
      if (key !== 'Query' && key !== 'Mutation') {
        if (!result[key]) {
          result[key] = {}
        }
        if (typeof value === 'object' && value !== null) {
          Object.assign(result[key], value)
        }
      }
    }
  }

  return result
}

// Временно импортируем старые резолверы для частей, которые еще не вынесены
// TODO: Постепенно убрать это после полного рефакторинга

// Объединяем новые модульные резолверы с остальными старыми
export const resolvers = mergeResolvers(
  // Скалярные типы
  {
    JSON: JSONScalar,
    DateTime: DateTimeScalar,
  },

  // Новые модульные резолверы
  authResolvers,
  employeeResolvers,
  logisticsResolvers,
  suppliesResolvers,

  // Временно добавляем старые резолверы, исключая уже вынесенные
  {
    Query: {
      ...oldResolvers.Query,
      // Исключаем уже вынесенные Query
      myEmployees: undefined,
      logisticsPartners: undefined,
      pendingSuppliesCount: undefined,
    },
    Mutation: {
      ...oldResolvers.Mutation,
      // Исключаем уже вынесенные Mutation
      sendSmsCode: undefined,
      verifySmsCode: undefined,
      verifyInn: undefined,
      registerFulfillmentOrganization: undefined,
      createEmployee: undefined,
      updateEmployee: undefined,
      deleteEmployee: undefined,
      assignLogisticsToSupply: undefined,
      logisticsConfirmOrder: undefined,
      logisticsRejectOrder: undefined,
    },
    // Остальные типы пока оставляем из старых резолверов
    User: oldResolvers.User,
    Organization: oldResolvers.Organization,
    Product: oldResolvers.Product,
    // SupplyOrder: oldResolvers.SupplyOrder, // Удалено: отсутствует в старых резолверах
    // Employee берем из нового модуля
    Employee: undefined,
  },
)
