import { GraphQLError } from "graphql";
import { Context } from "../context";
import { prisma } from "../../lib/prisma";

export const logisticsResolvers = {
  Query: {
    // Получить логистические компании-партнеры
    logisticsPartners: async (_: unknown, __: unknown, context: Context) => {
      if (!context.user) {
        throw new GraphQLError("Требуется авторизация", {
          extensions: { code: "UNAUTHENTICATED" },
        });
      }

      // Получаем все организации типа LOGIST
      return await prisma.organization.findMany({
        where: {
          type: "LOGIST",
          // Убираем фильтр по статусу пока не определим правильные значения
        },
        orderBy: { createdAt: "desc" }, // Сортируем по дате создания вместо name
      });
    },
  },

  Mutation: {
    // Назначить логистику на поставку (используется фулфилментом)
    assignLogisticsToSupply: async (
      _: unknown,
      args: {
        supplyOrderId: string;
        logisticsPartnerId: string;
        responsibleId?: 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("У пользователя нет организации");
      }

      if (currentUser.organization.type !== "FULFILLMENT") {
        throw new GraphQLError("Доступно только для фулфилмент центров");
      }

      try {
        // Находим заказ
        const existingOrder = await prisma.supplyOrder.findUnique({
          where: { id: args.supplyOrderId },
          include: {
            partner: true,
            fulfillmentCenter: true,
            logisticsPartner: true,
            items: {
              include: { product: true },
            },
          },
        });

        if (!existingOrder) {
          throw new GraphQLError("Заказ поставки не найден");
        }

        // Проверяем, что это заказ для нашего фулфилмент-центра
        if (existingOrder.fulfillmentCenterId !== currentUser.organization.id) {
          throw new GraphQLError("Нет доступа к этому заказу");
        }

        // Проверяем, что статус позволяет назначить логистику
        if (existingOrder.status !== "SUPPLIER_APPROVED") {
          throw new GraphQLError(
            `Нельзя назначить логистику для заказа со статусом ${existingOrder.status}`
          );
        }

        // Проверяем, что логистическая компания существует
        const logisticsPartner = await prisma.organization.findUnique({
          where: { id: args.logisticsPartnerId },
        });

        if (!logisticsPartner || logisticsPartner.type !== "LOGIST") {
          throw new GraphQLError("Логистическая компания не найдена");
        }

        // Обновляем заказ
        const updatedOrder = await prisma.supplyOrder.update({
          where: { id: args.supplyOrderId },
          data: {
            logisticsPartner: {
              connect: { id: args.logisticsPartnerId },
            },
            status: "CONFIRMED", // Переводим в статус "подтвержден фулфилментом"
          },
          include: {
            partner: true,
            fulfillmentCenter: true,
            logisticsPartner: true,
            items: {
              include: { product: true },
            },
          },
        });

        console.log(`✅ Логистика назначена на заказ ${args.supplyOrderId}:`, {
          logisticsPartner: logisticsPartner.name,
          responsible: args.responsibleId,
          newStatus: "CONFIRMED",
        });

        return {
          success: true,
          message: "Логистика успешно назначена",
          order: updatedOrder,
        };
      } catch (error) {
        console.error("❌ Ошибка при назначении логистики:", error);
        return {
          success: false,
          message:
            error instanceof Error
              ? error.message
              : "Ошибка при назначении логистики",
        };
      }
    },

    // Подтвердить заказ логистической компанией
    logisticsConfirmOrder: async (
      _: unknown,
      args: { id: 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 {
        const existingOrder = await prisma.supplyOrder.findFirst({
          where: {
            id: args.id,
            logisticsPartnerId: currentUser.organization.id,
            OR: [{ status: "SUPPLIER_APPROVED" }, { status: "CONFIRMED" }],
          },
        });

        if (!existingOrder) {
          return {
            success: false,
            message:
              "Заказ не найден или недоступен для подтверждения логистикой",
          };
        }

        const updatedOrder = await prisma.supplyOrder.update({
          where: { id: args.id },
          data: { status: "LOGISTICS_CONFIRMED" },
          include: {
            partner: true,
            organization: true,
            fulfillmentCenter: true,
            logisticsPartner: true,
            items: {
              include: {
                product: {
                  include: {
                    category: true,
                    organization: true,
                  },
                },
              },
            },
          },
        });

        return {
          success: true,
          message: "Заказ подтвержден логистической компанией",
          order: updatedOrder,
        };
      } catch (error) {
        console.error("Error confirming supply order:", error);
        return {
          success: false,
          message: "Ошибка при подтверждении заказа",
        };
      }
    },

    // Отклонить заказ логистической компанией
    logisticsRejectOrder: async (
      _: unknown,
      args: { id: 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 {
        const existingOrder = await prisma.supplyOrder.findFirst({
          where: {
            id: args.id,
            logisticsPartnerId: currentUser.organization.id,
            OR: [{ status: "SUPPLIER_APPROVED" }, { status: "CONFIRMED" }],
          },
        });

        if (!existingOrder) {
          return {
            success: false,
            message: "Заказ не найден или недоступен для отклонения логистикой",
          };
        }

        const updatedOrder = await prisma.supplyOrder.update({
          where: { id: args.id },
          data: {
            status: "CANCELLED",
            logisticsPartnerId: null, // Убираем назначенную логистику
          },
          include: {
            partner: true,
            organization: true,
            fulfillmentCenter: true,
            logisticsPartner: true,
            items: {
              include: {
                product: {
                  include: {
                    category: true,
                    organization: true,
                  },
                },
              },
            },
          },
        });

        return {
          success: true,
          message: "Заказ отклонен логистической компанией",
          order: updatedOrder,
        };
      } catch (error) {
        console.error("Error rejecting supply order:", error);
        return {
          success: false,
          message: "Ошибка при отклонении заказа",
        };
      }
    },
  },
};
