import { GraphQLError } from 'graphql'

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

// File Management Domain Resolvers - управление файлами и кешированием данных

// =============================================================================
// 🔐 AUTHENTICATION HELPERS
// =============================================================================

const withAuth = (resolver: any) => {
  return async (parent: any, args: any, context: Context) => {
    console.log('🔐 FILE MANAGEMENT DOMAIN AUTH CHECK:', { 
      hasUser: !!context.user, 
      userId: context.user?.id,
      organizationId: context.user?.organizationId, 
    })
    if (!context.user) {
      console.error('❌ AUTH FAILED: No user in context')
      throw new GraphQLError('Требуется авторизация', {
        extensions: { code: 'UNAUTHENTICATED' },
      })
    }
    console.log('✅ AUTH PASSED: Calling resolver')
    try {
      const result = await resolver(parent, args, context)
      console.log('🎯 RESOLVER RESULT TYPE:', typeof result, result === null ? 'NULL RESULT!' : 'Has result')
      return result
    } catch (error) {
      console.error('💥 RESOLVER ERROR:', error)
      throw error
    }
  }
}

// =============================================================================
// 📁 FILE MANAGEMENT DOMAIN RESOLVERS
// =============================================================================

export const fileManagementResolvers: DomainResolvers = {
  Query: {
    // Получение кешированных данных склада Wildberries
    getWBWarehouseData: withAuth(async (_: unknown, __: unknown, context: Context) => {
      console.log('🔍 GET_WB_WAREHOUSE_DATA DOMAIN QUERY STARTED:', { userId: context.user?.id })
      
      try {
        const user = await prisma.user.findUnique({
          where: { id: context.user!.id },
          include: { organization: true },
        })

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

        // Поиск кеша для организации
        const cache = await prisma.wbWarehouseCache.findFirst({
          where: { organizationId: user.organization.id },
          orderBy: { createdAt: 'desc' },
        })

        if (!cache) {
          console.log('🔍 GET_WB_WAREHOUSE_DATA: No cache found')
          return {
            success: false,
            message: 'Кеш данных склада не найден. Загрузите данные из API.',
            data: null,
            fromCache: false,
          }
        }

        // Проверка срока действия кеша
        const now = new Date()
        if (cache.expiresAt && cache.expiresAt <= now) {
          console.log('🔍 GET_WB_WAREHOUSE_DATA: Cache expired')
          return {
            success: false,
            message: 'Кеш данных склада устарел. Требуется обновление из API.',
            data: null,
            fromCache: false,
          }
        }

        // Парсинг JSON данных
        let parsedData = null
        if (cache.data) {
          try {
            parsedData = typeof cache.data === 'string' 
              ? JSON.parse(cache.data) 
              : cache.data
          } catch (error) {
            console.error('Error parsing cache data:', error)
            return {
              success: false,
              message: 'Ошибка при чтении кеша данных склада',
              data: null,
              fromCache: false,
            }
          }
        }

        console.log('✅ GET_WB_WAREHOUSE_DATA DOMAIN SUCCESS:', { 
          organizationId: user.organization.id,
          hasData: !!parsedData,
          cacheAge: Math.round((now.getTime() - cache.createdAt.getTime()) / 1000 / 60), // минуты
        })

        return {
          success: true,
          message: 'Данные склада получены из кеша',
          data: parsedData,
          fromCache: true,
          cachedAt: cache.createdAt.toISOString(),
          expiresAt: cache.expiresAt?.toISOString() || null,
        }
      } catch (error: any) {
        console.error('❌ GET_WB_WAREHOUSE_DATA DOMAIN ERROR:', error)
        return {
          success: false,
          message: error.message || 'Ошибка при получении данных склада',
          data: null,
          fromCache: false,
        }
      }
    }),

    // Получение кешированной статистики селлера
    getSellerStatsCache: withAuth(async (
      _: unknown,
      args: { period: string; dateFrom?: string | null; dateTo?: string | null },
      context: Context,
    ) => {
      console.log('🔍 GET_SELLER_STATS_CACHE DOMAIN QUERY STARTED:', { 
        userId: context.user?.id,
        period: args.period,
        dateFrom: args.dateFrom,
        dateTo: args.dateTo,
      })

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

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

        const today = new Date()
        today.setHours(0, 0, 0, 0)

        // Условия поиска кеша
        const where: any = {
          organizationId: user.organization.id,
          cacheDate: today,
          period: args.period,
        }

        // Для custom периода учитываем диапазон дат
        if (args.period === 'custom') {
          if (!args.dateFrom || !args.dateTo) {
            throw new GraphQLError('Для custom периода необходимо указать dateFrom и dateTo')
          }
          where.dateFrom = new Date(args.dateFrom)
          where.dateTo = new Date(args.dateTo)
        }

        const cache = await prisma.sellerStatsCache.findFirst({
          where,
          orderBy: { createdAt: 'desc' },
        })

        if (!cache) {
          console.log('🔍 GET_SELLER_STATS_CACHE: No cache found')
          return {
            success: true,
            message: 'Кеш не найден',
            cache: null,
            fromCache: false,
          }
        }

        // Проверка срока действия кеша
        const now = new Date()
        if (cache.expiresAt && cache.expiresAt <= now) {
          console.log('🔍 GET_SELLER_STATS_CACHE: Cache expired')
          return {
            success: true,
            message: 'Кеш устарел, требуется загрузка из API',
            cache: null,
            fromCache: false,
          }
        }

        console.log('✅ GET_SELLER_STATS_CACHE DOMAIN SUCCESS:', { 
          organizationId: user.organization.id,
          period: args.period,
          cacheAge: Math.round((now.getTime() - cache.createdAt.getTime()) / 1000 / 60), // минуты
        })

        return {
          success: true,
          message: 'Данные получены из кеша',
          cache: {
            ...cache,
            cacheDate: cache.cacheDate.toISOString().split('T')[0],
            dateFrom: cache.dateFrom ? cache.dateFrom.toISOString().split('T')[0] : null,
            dateTo: cache.dateTo ? cache.dateTo.toISOString().split('T')[0] : null,
            productsTotalSales: cache.productsTotalSales ? Number(cache.productsTotalSales) : null,
            advertisingTotalCost: cache.advertisingTotalCost ? Number(cache.advertisingTotalCost) : null,
            expiresAt: cache.expiresAt?.toISOString() || null,
            createdAt: cache.createdAt.toISOString(),
            updatedAt: cache.updatedAt.toISOString(),
          },
          fromCache: true,
        }
      } catch (error: any) {
        console.error('❌ GET_SELLER_STATS_CACHE DOMAIN ERROR:', error)
        throw new GraphQLError(error.message || 'Ошибка при получении кеша статистики')
      }
    }),
  },

  Mutation: {
    // Сохранение кеша данных склада WB
    saveWBWarehouseCache: withAuth(async (
      _: unknown,
      args: { data: any },
      context: Context,
    ) => {
      console.log('🔍 SAVE_WB_WAREHOUSE_CACHE DOMAIN MUTATION STARTED:', { 
        userId: context.user?.id,
        hasData: !!args.data,
        dataSize: args.data ? JSON.stringify(args.data).length : 0,
      })

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

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

        if (!args.data) {
          throw new GraphQLError('Данные для сохранения не предоставлены')
        }

        // Устанавливаем срок действия кеша (1 час)
        const expiresAt = new Date()
        expiresAt.setHours(expiresAt.getHours() + 1)

        // Сериализация данных в JSON
        const serializedData = typeof args.data === 'string' 
          ? args.data 
          : JSON.stringify(args.data)

        // Удаление старого кеша для этой организации
        await prisma.wbWarehouseCache.deleteMany({
          where: { organizationId: user.organization.id },
        })

        // Сохранение нового кеша
        const cache = await prisma.wbWarehouseCache.create({
          data: {
            organizationId: user.organization.id,
            data: serializedData,
            expiresAt,
          },
        })

        console.log('✅ SAVE_WB_WAREHOUSE_CACHE DOMAIN SUCCESS:', { 
          organizationId: user.organization.id,
          cacheId: cache.id,
          dataSize: serializedData.length,
          expiresAt: cache.expiresAt?.toISOString(),
        })

        return {
          success: true,
          message: 'Кеш данных склада успешно сохранен',
          cache: {
            id: cache.id,
            organizationId: cache.organizationId,
            createdAt: cache.createdAt.toISOString(),
            expiresAt: cache.expiresAt?.toISOString() || null,
          },
          fromCache: false,
        }
      } catch (error: any) {
        console.error('❌ SAVE_WB_WAREHOUSE_CACHE DOMAIN ERROR:', error)
        return {
          success: false,
          message: error.message || 'Ошибка сохранения кеша склада WB',
          cache: null,
          fromCache: false,
        }
      }
    }),
  },
}

console.warn('🔥 FILE MANAGEMENT DOMAIN МОДУЛЬ ЭКСПОРТЫ ГОТОВЫ')