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

import { authResolvers } from './auth'
import { employeeResolvers } from './employees'
import { logisticsResolvers } from './logistics'
import { referralResolvers } from './referrals'
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: Постепенно убрать это после полного рефакторинга

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

  // Временно добавляем старые резолверы ПЕРВЫМИ, чтобы новые их перезаписали
  {
    Query: (() => {
      const {
        myEmployees: _myEmployees,
        logisticsPartners: _logisticsPartners,
        pendingSuppliesCount: _pendingSuppliesCount,
        myReferralLink: _myReferralLink,
        myPartnerLink: _myPartnerLink,
        myReferralStats: _myReferralStats,
        myReferrals: _myReferrals,
        ...filteredQuery
      } = oldResolvers.Query || {}
      return filteredQuery
    })(),
    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,
  },

  // НОВЫЕ модульные резолверы ПОСЛЕ старых - чтобы они перезаписали старые
  authResolvers,
  employeeResolvers,
  logisticsResolvers,
  suppliesResolvers,
  referralResolvers,
)

export const resolvers = mergedResolvers
