/*
 * 🚀 ORGANIZATION MANAGEMENT RESOLVERS
 * 
 * ФИНАЛИЗАЦИЯ ПЕРЕХОДА НА НОВУЮ СИСТЕМУ
 * 
 * Дата завершения миграции: 17.09.2025
 * 
 * ✅ Новая универсальная система регистрации организаций полностью активна
 * ✅ Использует OrganizationRegistrationService для бизнес-логики
 * ✅ Единая мутация registerOrganization для всех типов организаций
 * ✅ Улучшенная обработка ошибок и транзакции
 * 
 * Примечание: Старые функции registerFulfillmentOrganization и registerSellerOrganization
 * остаются активными для обратной совместимости, но рекомендуется использовать
 * новую универсальную функцию registerOrganization.
 */

import { GraphQLError } from 'graphql'
import * as jwt from 'jsonwebtoken'

import { prisma } from '../../../lib/prisma'
import { DaDataService } from '../../../services/dadata-service'
import { OrganizationRegistrationService, OrganizationRegistrationInput } from '../../../services/organization-registration-service'
import { Context } from '../../context'
import { apiKeyUtility, ApiKeyInput } from '../shared/api-keys'
import { DomainResolvers } from '../shared/types'

// Типы для JWT токена
interface AuthTokenPayload {
  userId: string
  phone: string
}

// JWT утилита
const generateToken = (payload: AuthTokenPayload): string => {
  return jwt.sign(payload, process.env.JWT_SECRET!, { expiresIn: '30d' })
}

// DaData сервис
const dadataService = new DaDataService()

// Organization Management Domain Resolvers - управление организациями
export const organizationManagementResolvers: DomainResolvers = {
  Query: {
    // Получить организацию по ID
    organization: async (_: unknown, args: { id: string }, context: Context) => {
      if (!context.user) {
        throw new GraphQLError('Требуется авторизация', {
          extensions: { code: 'UNAUTHENTICATED' },
        })
      }

      const organization = await prisma.organization.findUnique({
        where: { id: args.id },
        include: {
          apiKeys: true,
          users: true,
        },
      })

      if (!organization) {
        throw new GraphQLError('Организация не найдена')
      }

      // Проверяем, что пользователь имеет доступ к этой организации
      const hasAccess = organization.users.some((user) => user.id === context.user!.id)
      if (!hasAccess) {
        throw new GraphQLError('Нет доступа к этой организации', {
          extensions: { code: 'FORBIDDEN' },
        })
      }

      return organization
    },

    // Поиск организаций
    searchOrganizations: async (_: unknown, args: { type?: string; search?: string }, context: Context) => {
      if (!context.user) {
        throw new GraphQLError('Требуется авторизация', {
          extensions: { code: 'UNAUTHENTICATED' },
        })
      }

      // Получаем текущую организацию пользователя
      const currentUser = await prisma.user.findUnique({
        where: { id: context.user.id },
        include: { organization: true },
      })

      if (!currentUser?.organization) {
        throw new GraphQLError('У пользователя нет организации')
      }

      // Получаем уже существующих контрагентов для добавления флага
      const existingCounterparties = await prisma.counterparty.findMany({
        where: { organizationId: currentUser.organization.id },
        select: { counterpartyId: true },
      })

      const existingCounterpartyIds = existingCounterparties.map((c) => c.counterpartyId)

      // Получаем исходящие заявки для добавления флага hasOutgoingRequest
      const outgoingRequests = await prisma.counterpartyRequest.findMany({
        where: {
          senderId: currentUser.organization.id,
          status: 'PENDING',
        },
        select: { receiverId: true },
      })

      const outgoingRequestIds = outgoingRequests.map((r) => r.receiverId)

      // Строим условия поиска
      const whereConditions: Record<string, unknown> = {
        id: { not: currentUser.organization.id }, // Исключаем свою организацию
      }

      // Фильтр по типу организации
      if (args.type) {
        whereConditions.type = args.type
      }

      // Фильтр по тексту поиска
      if (args.search) {
        whereConditions.OR = [
          { name: { contains: args.search, mode: 'insensitive' } },
          { fullName: { contains: args.search, mode: 'insensitive' } },
          { inn: { contains: args.search, mode: 'insensitive' } },
        ]
      }

      const organizations = await prisma.organization.findMany({
        where: whereConditions,
        include: {
          users: true,
          apiKeys: true,
        },
        take: 50, // Ограничиваем результаты
        orderBy: { createdAt: 'desc' },
      })

      // Добавляем флаги для каждой организации
      return organizations.map((org) => ({
        ...org,
        isCounterparty: existingCounterpartyIds.includes(org.id),
        hasOutgoingRequest: outgoingRequestIds.includes(org.id),
        isCurrentUser: false, // Уже исключили текущую организацию выше
      }))
    },
  },

  Mutation: {
    // Регистрация фулфилмент организации
    registerFulfillmentOrganization: async (
      _: unknown,
      args: {
        input: {
          phone: string
          inn: string
          type: 'FULFILLMENT' | 'LOGIST' | 'WHOLESALE'
          kpp?: string
          name?: string
          fullName?: string
          address?: string
          addressFull?: string
          ogrn?: string
          ogrnDate?: string
          managerName?: string
          managerEmail?: string
          managerPhone?: string
          description?: string
          logoUrl?: string
          website?: string
          bankName?: string
          bik?: string
          correspondentAccount?: string
          currentAccount?: string
          taxSystem?: string
          referralCode?: string
          partnerCode?: string
        }
      },
      context: Context,
    ) => {
      console.warn('🏢 REGISTER_FULFILLMENT_ORGANIZATION - ВЫЗВАН:', {
        phone: args.input.phone,
        inn: args.input.inn,
        referralCode: args.input.referralCode,
        partnerCode: args.input.partnerCode,
        timestamp: new Date().toISOString(),
      })

      try {
        // Проверяем уникальность ИНН
        const existingOrganization = await prisma.organization.findFirst({
          where: { inn: args.input.inn },
        })

        if (existingOrganization) {
          return {
            success: false,
            message: 'Организация с таким ИНН уже зарегистрирована',
            token: null,
            user: null,
          }
        }

        // Проверяем уникальность телефона
        const existingUser = await prisma.user.findUnique({
          where: { phone: args.input.phone },
        })

        if (existingUser && existingUser.organizationId) {
          return {
            success: false,
            message: 'Пользователь с таким телефоном уже зарегистрирован в системе',
            token: null,
            user: null,
          }
        }

        // Обработка реферального кода
        let referredByOrganization = null
        if (args.input.referralCode) {
          referredByOrganization = await prisma.organization.findUnique({
            where: { referralCode: args.input.referralCode },
          })

          if (!referredByOrganization) {
            console.warn('⚠️ Неверный реферальный код:', args.input.referralCode)
            return {
              success: false,
              message: 'Неверный реферальный код',
              token: null,
              user: null,
            }
          }
        }

        // Получаем данные организации из DaData
        console.warn('🔍 Получение данных организации из DaData для ИНН:', args.input.inn)
        const organizationData = await dadataService.getOrganizationByInn(args.input.inn)
        
        if (!organizationData) {
          console.error('❌ Данные организации не найдены в DaData:', args.input.inn)
          return {
            success: false,
            message: 'Организация с таким ИНН не найдена в реестре',
            token: null,
            user: null,
          }
        }

        console.warn('✅ Данные из DaData получены:', {
          name: organizationData.name,
          fullName: organizationData.fullName,
          address: organizationData.address,
          isActive: organizationData.isActive,
        })

        // 🔒 КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ: Создание организации и пользователя в транзакции
        const result = await prisma.$transaction(async (tx) => {
          console.warn('🔄 Начинаем транзакцию создания фулфилмент организации:', {
            inn: args.input.inn,
            type: args.input.type,
            phone: args.input.phone,
          })

          // Создаем организацию
          const organization = await tx.organization.create({
            data: {
              inn: args.input.inn,
              kpp: organizationData.kpp || args.input.kpp,
              name: organizationData.name || args.input.name,
              fullName: organizationData.fullName || args.input.fullName,
              address: organizationData.address || args.input.address,
              addressFull: organizationData.addressFull || args.input.addressFull,
              ogrn: organizationData.ogrn || args.input.ogrn,
              ogrnDate: organizationData.ogrnDate || (args.input.ogrnDate ? new Date(args.input.ogrnDate) : null),
              type: args.input.type,
              // Дополнительные данные из DaData
              status: organizationData.status || null,
              actualityDate: organizationData.actualityDate || null,
              registrationDate: organizationData.registrationDate || null,
              liquidationDate: organizationData.liquidationDate || null,
              managementName: organizationData.managementName || null,
              managementPost: organizationData.managementPost || null,
              opfCode: organizationData.opfCode || null,
              opfFull: organizationData.opfFull || null,
              opfShort: organizationData.opfShort || null,
              okato: organizationData.okato || null,
              oktmo: organizationData.oktmo || null,
              okpo: organizationData.okpo || null,
              okved: organizationData.okved || null,
              employeeCount: organizationData.employeeCount || null,
              revenue: organizationData.revenue ? BigInt(organizationData.revenue) : null,
              taxSystem: organizationData.taxSystem || args.input.taxSystem,
              phones: organizationData.phones ? JSON.stringify(organizationData.phones) : null,
              emails: organizationData.emails ? JSON.stringify(organizationData.emails) : null,
              referralCode: `FF_${args.input.inn}_${Date.now()}`,
              referredById: referredByOrganization?.id,
            },
            include: {
              apiKeys: true,
            },
          })

          console.warn('✅ Организация создана в транзакции:', { 
            organizationId: organization.id, 
            name: organization.name, 
          })

          // Создаем или обновляем пользователя в той же транзакции
          let user
          if (existingUser) {
            user = await tx.user.update({
              where: { id: existingUser.id },
              data: { organizationId: organization.id },
              include: {
                organization: {
                  include: {
                    apiKeys: true,
                  },
                },
              },
            })
            console.warn('✅ Существующий пользователь обновлен в транзакции:', { 
              userId: user.id,
              organizationId: organization.id, 
            })
          } else {
            user = await tx.user.create({
              data: {
                phone: args.input.phone,
                organizationId: organization.id,
              },
              include: {
                organization: {
                  include: {
                    apiKeys: true,
                  },
                },
              },
            })
            console.warn('✅ Новый пользователь создан в транзакции:', { 
              userId: user.id,
              organizationId: organization.id, 
            })
          }

          return { organization, user }
        }, {
          timeout: 30000, // 30 секунд максимум на транзакцию
          maxWait: 5000,   // Максимум 5 секунд ожидания блокировки
        })

        const { organization, user } = result
        console.warn('🎉 Транзакция успешно завершена:', {
          organizationId: organization.id,
          userId: user.id,
          organizationType: organization.type,
        })

        // 🤝 ОБРАБОТКА ПАРТНЕРСКОГО КОДА (автопартнерство) В ОТДЕЛЬНОЙ ТРАНЗАКЦИИ
        if (args.input.partnerCode) {
          try {
            console.warn('🔍 ПАРТНЕРСКИЙ КОД ПРОВЕРКА:', {
              partnerCode: args.input.partnerCode,
              hasPartnerCode: !!args.input.partnerCode,
              partnerCodeLength: args.input.partnerCode?.length,
              organizationId: organization.id,
            })
            
            // Находим партнера по партнерскому коду
            const partner = await prisma.organization.findUnique({
              where: { referralCode: args.input.partnerCode },
            })
            
            console.warn('🔍 РЕЗУЛЬТАТ ПОИСКА ПАРТНЕРА:', {
              found: !!partner,
              partnerId: partner?.id,
              partnerName: partner?.name,
              partnerType: partner?.type,
            })

            if (partner) {
              // 🔒 КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ: Партнерская логика в отдельной транзакции
              await prisma.$transaction(async (tx) => {
                console.warn('🔄 Начинаем транзакцию партнерства:', {
                  partnerId: partner.id,
                  organizationId: organization.id,
                  points: 100,
                })

                // Создаем реферальную транзакцию (100 сфер)
                await tx.referralTransaction.create({
                  data: {
                    referrerId: partner.id,
                    referralId: organization.id,
                    points: 100,
                    type: 'AUTO_PARTNERSHIP',
                    description: `Регистрация ${args.input.type.toLowerCase()} организации по партнерской ссылке`,
                  },
                })

                // Увеличиваем счетчик сфер у партнера
                await tx.organization.update({
                  where: { id: partner.id },
                  data: { referralPoints: { increment: 100 } },
                })

                // Устанавливаем связь реферала и источник регистрации
                await tx.organization.update({
                  where: { id: organization.id },
                  data: { referredById: partner.id },
                })

                // Создаем партнерскую связь (автоматическое добавление в контрагенты)
                await tx.counterparty.create({
                  data: {
                    organizationId: partner.id,
                    counterpartyId: organization.id,
                    type: 'AUTO',
                    triggeredBy: 'PARTNER_LINK',
                  },
                })

                await tx.counterparty.create({
                  data: {
                    organizationId: organization.id,
                    counterpartyId: partner.id,
                    type: 'AUTO',
                    triggeredBy: 'PARTNER_LINK',
                  },
                })

                console.warn('✅ Партнерская транзакция завершена успешно')
              }, {
                timeout: 20000, // 20 секунд для партнерских операций
                maxWait: 3000,   // 3 секунды ожидания
              })

              console.warn('🤝 Автоматическое партнерство создано по partnerCode:', {
                organizationId: organization.id,
                partnerId: partner.id,
                referralPoints: 100,
                type: args.input.type,
              })
            } else {
              console.warn('⚠️ Партнер не найден по коду:', args.input.partnerCode)
            }
          } catch (partnerError) {
            console.error('❌ Критическая ошибка обработки партнерского кода:', partnerError)
            // Партнерская ошибка не должна блокировать создание организации
            // Организация уже создана в предыдущей транзакции
          }
        }

        // Начисляем реферальные баллы (если есть реферер)
        if (referredByOrganization) {
          await prisma.organization.update({
            where: { id: referredByOrganization.id },
            data: {
              referralPoints: {
                increment: 100, // 100 баллов за привлечение фулфилмента
              },
            },
          })

          console.warn('💰 Начислены реферальные баллы:', {
            referrerId: referredByOrganization.id,
            points: 100,
            newOrganizationId: organization.id,
          })
        }

        // Создаем JWT токен
        const token = generateToken({
          userId: user.id,
          phone: user.phone,
        })

        console.warn('✅ ФУЛФИЛМЕНТ ОРГАНИЗАЦИЯ СОЗДАНА:', {
          organizationId: organization.id,
          userId: user.id,
          inn: organization.inn,
          type: organization.type,
          referralCode: organization.referralCode,
        })

        return {
          success: true,
          message: 'Фулфилмент организация успешно зарегистрирована',
          token,
          user,
        }
      } catch (error) {
        console.error('Error registering fulfillment organization:', error)
        return {
          success: false,
          message: 'Ошибка при регистрации организации',
          token: null,
          user: null,
        }
      }
    },

    // Регистрация селлер организации
    registerSellerOrganization: async (
      _: unknown,
      args: {
        input: {
          phone: string
          wbApiKey?: string
          ozonApiKey?: string
          ozonClientId?: string
          referralCode?: string
          partnerCode?: string
        }
      },
      context: Context,
    ) => {
      console.warn('🛍️ REGISTER_SELLER_ORGANIZATION - ВЫЗВАН:', {
        phone: args.input.phone,
        wbApiKey: args.input.wbApiKey ? '[СКРЫТ]' : undefined,
        ozonApiKey: args.input.ozonApiKey ? '[СКРЫТ]' : undefined,
        partnerCode: args.input.partnerCode,
        referralCode: args.input.referralCode,
        timestamp: new Date().toISOString(),
      })

      try {
        // УБРАНА ПРОВЕРКА ИНН - селлеры не требуют ИНН для регистрации

        // Проверяем уникальность телефона
        const existingUser = await prisma.user.findUnique({
          where: { phone: args.input.phone },
        })

        if (existingUser && existingUser.organizationId) {
          return {
            success: false,
            message: 'Пользователь с таким телефоном уже зарегистрирован в системе',
            token: null,
            user: null,
          }
        }

        // Обработка реферального кода
        let referredByOrganization = null
        if (args.input.referralCode) {
          referredByOrganization = await prisma.organization.findUnique({
            where: { referralCode: args.input.referralCode },
          })

          if (!referredByOrganization) {
            console.warn('⚠️ Неверный реферальный код:', args.input.referralCode)
            return {
              success: false,
              message: 'Неверный реферальный код',
              token: null,
              user: null,
            }
          }
        }

        // 🔒 КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ: Создание селлер организации и пользователя в транзакции
        const result = await prisma.$transaction(async (tx) => {
          console.warn('🔄 Начинаем транзакцию создания селлер организации:', {
            phone: args.input.phone,
            type: 'SELLER',
          })

          // Создаем организацию селлера с псевдо-ИНН
          const organization = await tx.organization.create({
            data: {
              inn: `SELLER_${Date.now()}`, // Псевдо-ИНН для селлеров
              type: 'SELLER',
              name: `Селлер ${args.input.phone}`, // Временное название на основе телефона
              referralCode: `SL_${args.input.phone.replace(/\D/g, '')}_${Date.now()}`,
              referredById: referredByOrganization?.id,
            },
            include: {
              apiKeys: true,
            },
          })

          console.warn('✅ Селлер организация создана в транзакции:', { 
            organizationId: organization.id, 
            name: organization.name, 
          })

          // Создаем или обновляем пользователя в той же транзакции
          let user
          if (existingUser) {
            user = await tx.user.update({
              where: { id: existingUser.id },
              data: { organizationId: organization.id },
              include: {
                organization: {
                  include: {
                    apiKeys: true,
                  },
                },
              },
            })
            console.warn('✅ Существующий пользователь обновлен в транзакции:', { 
              userId: user.id,
              organizationId: organization.id, 
            })
          } else {
            user = await tx.user.create({
              data: {
                phone: args.input.phone,
                organizationId: organization.id,
              },
              include: {
                organization: {
                  include: {
                    apiKeys: true,
                  },
                },
              },
            })
            console.warn('✅ Новый пользователь создан в транзакции:', { 
              userId: user.id,
              organizationId: organization.id, 
            })
          }

          return { organization, user }
        }, {
          timeout: 30000, // 30 секунд максимум на транзакцию
          maxWait: 5000,   // Максимум 5 секунд ожидания блокировки
        })

        const { organization, user } = result
        console.warn('🎉 Транзакция селлера успешно завершена:', {
          organizationId: organization.id,
          userId: user.id,
          organizationType: organization.type,
        })

        // 🤝 ОБРАБОТКА ПАРТНЕРСКОГО КОДА ДЛЯ СЕЛЛЕРА (автопартнерство) В ОТДЕЛЬНОЙ ТРАНЗАКЦИИ
        if (args.input.partnerCode) {
          try {
            console.warn('🔍 ПАРТНЕРСКИЙ КОД ПРОВЕРКА (SELLER):', {
              partnerCode: args.input.partnerCode,
              hasPartnerCode: !!args.input.partnerCode,
              partnerCodeLength: args.input.partnerCode?.length,
              organizationId: organization.id,
            })
            
            // Находим партнера по партнерскому коду
            const partner = await prisma.organization.findUnique({
              where: { referralCode: args.input.partnerCode },
            })
            
            console.warn('🔍 РЕЗУЛЬТАТ ПОИСКА ПАРТНЕРА (SELLER):', {
              found: !!partner,
              partnerId: partner?.id,
              partnerName: partner?.name,
              partnerType: partner?.type,
            })

            if (partner) {
              // 🔒 КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ: Партнерская логика селлера в отдельной транзакции
              await prisma.$transaction(async (tx) => {
                console.warn('🔄 Начинаем транзакцию партнерства селлера:', {
                  partnerId: partner.id,
                  organizationId: organization.id,
                  points: 100,
                })

                // Создаем реферальную транзакцию (100 сфер)
                await tx.referralTransaction.create({
                  data: {
                    referrerId: partner.id,
                    referralId: organization.id,
                    points: 100,
                    type: 'AUTO_PARTNERSHIP',
                    description: 'Регистрация селлер организации по партнерской ссылке',
                  },
                })

                // Увеличиваем счетчик сфер у партнера
                await tx.organization.update({
                  where: { id: partner.id },
                  data: { referralPoints: { increment: 100 } },
                })

                // Устанавливаем связь реферала и источник регистрации
                await tx.organization.update({
                  where: { id: organization.id },
                  data: { referredById: partner.id },
                })

                // Создаем партнерскую связь (автоматическое добавление в контрагенты)
                await tx.counterparty.create({
                  data: {
                    organizationId: partner.id,
                    counterpartyId: organization.id,
                    type: 'AUTO',
                    triggeredBy: 'PARTNER_LINK',
                  },
                })

                await tx.counterparty.create({
                  data: {
                    organizationId: organization.id,
                    counterpartyId: partner.id,
                    type: 'AUTO',
                    triggeredBy: 'PARTNER_LINK',
                  },
                })

                console.warn('✅ Партнерская транзакция селлера завершена успешно')
              }, {
                timeout: 20000, // 20 секунд для партнерских операций
                maxWait: 3000,   // 3 секунды ожидания
              })

              console.warn('🤝 Автоматическое партнерство селлера создано по partnerCode:', {
                organizationId: organization.id,
                partnerId: partner.id,
                referralPoints: 100,
              })
            } else {
              console.warn('⚠️ Партнер не найден по коду (SELLER):', args.input.partnerCode)
            }
          } catch (partnerError) {
            console.error('❌ Критическая ошибка обработки партнерского кода селлера:', partnerError)
            // Партнерская ошибка не должна блокировать создание организации
            // Организация уже создана в предыдущей транзакции
          }
        }

        // Начисляем реферальные баллы (если есть реферер)
        if (referredByOrganization) {
          await prisma.organization.update({
            where: { id: referredByOrganization.id },
            data: {
              referralPoints: {
                increment: 50, // 50 баллов за привлечение селлера
              },
            },
          })

          console.warn('💰 Начислены реферальные баллы:', {
            referrerId: referredByOrganization.id,
            points: 50,
            newOrganizationId: organization.id,
          })
        }

        // Обработка API ключей маркетплейсов
        const apiKeysToCreate: ApiKeyInput[] = []

        if (args.input.wbApiKey) {
          apiKeysToCreate.push({
            marketplace: 'WILDBERRIES',
            apiKey: args.input.wbApiKey,
          })
        }

        if (args.input.ozonApiKey && args.input.ozonClientId) {
          apiKeysToCreate.push({
            marketplace: 'OZON',
            apiKey: args.input.ozonApiKey,
            clientId: args.input.ozonClientId,
          })
        }

        // Сохраняем API ключи в базу данных
        if (apiKeysToCreate.length > 0) {
          console.warn('🔑 СОХРАНЕНИЕ API КЛЮЧЕЙ ДЛЯ СЕЛЛЕРА:', {
            organizationId: organization.id,
            keysCount: apiKeysToCreate.length,
            marketplaces: apiKeysToCreate.map(k => k.marketplace),
          })

          const apiKeysResult = await apiKeyUtility.createMultipleApiKeys(
            organization.id,
            apiKeysToCreate,
          )

          if (apiKeysResult.success) {
            console.warn('✅ ВСЕ API КЛЮЧИ СОХРАНЕНЫ УСПЕШНО:', {
              organizationId: organization.id,
              savedKeys: apiKeysResult.results.filter(r => r.success).length,
              totalKeys: apiKeysResult.results.length,
            })

            // Обновляем название организации данными продавца из маркетплейса
            if (apiKeysResult.sellerData) {
              const { sellerName, tradeMark } = apiKeysResult.sellerData
              const organizationName = tradeMark || sellerName || `Селлер ${args.input.phone}`

              console.warn('🏪 ОБНОВЛЕНИЕ НАЗВАНИЯ ОРГАНИЗАЦИИ:', {
                organizationId: organization.id,
                oldName: organization.name,
                newName: organizationName,
                source: tradeMark ? 'tradeMark' : sellerName ? 'sellerName' : 'fallback',
              })

              await prisma.organization.update({
                where: { id: organization.id },
                data: {
                  name: organizationName,
                  fullName: sellerName || tradeMark || null,
                },
              })

              console.warn('✅ НАЗВАНИЕ ОРГАНИЗАЦИИ ОБНОВЛЕНО:', {
                organizationId: organization.id,
                name: organizationName,
              })
            }
          } else {
            console.warn('⚠️ НЕКОТОРЫЕ API КЛЮЧИ НЕ СОХРАНЕНЫ:', {
              organizationId: organization.id,
              failed: apiKeysResult.results.filter(r => !r.success).map(r => r.message),
            })
          }
        }

        // Создаем JWT токен
        const token = generateToken({
          userId: user.id,
          phone: user.phone,
        })

        console.warn('✅ СЕЛЛЕР ОРГАНИЗАЦИЯ СОЗДАНА:', {
          organizationId: organization.id,
          userId: user.id,
          type: organization.type,
          referralCode: organization.referralCode,
        })

        return {
          success: true,
          message: 'Селлер организация успешно зарегистрирована',
          token,
          user,
        }
      } catch (error) {
        console.error('Error registering seller organization:', error)
        return {
          success: false,
          message: 'Ошибка при регистрации организации',
          token: null,
          user: null,
        }
      }
    },

    // Обновление организации по ИНН
    updateOrganizationByInn: async (_: unknown, args: { inn: string }, context: Context) => {
      if (!context.user) {
        throw new GraphQLError('Требуется авторизация', {
          extensions: { code: 'UNAUTHENTICATED' },
        })
      }

      const currentUser = await prisma.user.findUnique({
        where: { id: context.user.id },
        include: { organization: true },
      })

      if (!currentUser?.organization) {
        throw new GraphQLError('У пользователя нет организации')
      }

      try {
        // TODO: Интеграция с DaData для получения данных по ИНН
        // const dadataInfo = await dadataService.getOrganizationByInn(args.inn)

        // Заглушка для демо
        const updatedOrganization = await prisma.organization.update({
          where: { id: currentUser.organization.id },
          data: {
            inn: args.inn,
            // Здесь будут данные из DaData
            updatedAt: new Date(),
          },
          include: {
            apiKeys: true,
            users: true,
          },
        })

        return {
          success: true,
          message: 'Организация обновлена по ИНН',
          organization: updatedOrganization,
        }
      } catch (error) {
        console.error('Error updating organization by INN:', error)
        return {
          success: false,
          message: 'Ошибка при обновлении организации',
          organization: null,
        }
      }
    },

    // 🚀 Новая универсальная регистрация организации (V2)
    registerOrganization: async (
      _: unknown,
      args: { input: OrganizationRegistrationInput },
      context: Context,
    ) => {
      console.warn('🚀 REGISTER_ORGANIZATION - Новая универсальная мутация вызвана:', {
        phone: args.input.phone,
        type: args.input.type,
        hasInn: !!args.input.inn,
        hasWbApiKey: !!args.input.wbApiKey,
        hasOzonApiKey: !!args.input.ozonApiKey,
        referralCode: args.input.referralCode,
        partnerCode: args.input.partnerCode,
        timestamp: new Date().toISOString(),
      })

      try {
        // Используем новый OrganizationRegistrationService
        const registrationService = new OrganizationRegistrationService()
        const result = await registrationService.registerOrganization(args.input)

        console.warn('🚀 REGISTER_ORGANIZATION - Результат:', {
          success: result.success,
          hasUser: !!result.user,
          hasToken: !!result.token,
          message: result.message,
        })

        return result
      } catch (error) {
        console.error('❌ REGISTER_ORGANIZATION - Критическая ошибка:', error)
        return {
          success: false,
          message: 'Критическая ошибка при регистрации организации',
          token: null,
          user: null,
        }
      }
    },
  },

  // Типовой резолвер для Organization
  Organization: {
    users: async (parent: { id: string; users?: unknown[] }) => {
      // Если пользователи уже загружены через include, возвращаем их
      if (parent.users) {
        return parent.users
      }

      // Иначе загружаем отдельно
      return await prisma.user.findMany({
        where: { organizationId: parent.id },
      })
    },
    services: async (parent: { id: string; services?: unknown[] }) => {
      // Если услуги уже загружены через include, возвращаем их
      if (parent.services) {
        return parent.services
      }

      // Иначе загружаем отдельно
      return await prisma.service.findMany({
        where: { organizationId: parent.id },
        include: { organization: true },
        orderBy: { createdAt: 'desc' },
      })
    },
  },
}