import React, { createContext, useContext } from 'react';
import type { ReactNode } from 'react';

// Import des services et adaptateurs
import { CartService } from '../domains/cart/services/CartService';
import { CartAdapter } from '../domains/cart/adapters/CartAdapter';
import { NotificationService } from '../domains/notification/services/NotificationService';
import { NotificationAdapter } from '../domains/notification/adapters/NotificationAdapter';
import { OrderService } from '../domains/order/services/OrderService';
import { OrderAdapter } from '../domains/order/adapters/OrderAdapter';
import { PaymentService } from '../domains/payment/services/PaymentService';
import { PaymentAdapter } from '../domains/payment/adapters/PaymentAdapter';
import { ProductService } from '../domains/product/services/ProductService';
import { ProductAdapter } from '../domains/product/adapters/ProductAdapter';
import { UserService } from '../domains/user/services/UserService';
import { UserAdapter } from '../domains/user/adapters/UserAdapter';

// Création des adaptateurs
const cartRepository = new CartAdapter();
const notificationRepository = new NotificationAdapter();
const orderRepository = new OrderAdapter();
const paymentRepository = new PaymentAdapter();
const productRepository = new ProductAdapter();
const userRepository = new UserAdapter();

// Création des services avec leurs dépendances
const cartService = new CartService(cartRepository);
const notificationService = new NotificationService(notificationRepository);
const orderService = new OrderService(orderRepository);
const paymentService = new PaymentService(paymentRepository);
const productService = new ProductService(productRepository);
const userService = new UserService(userRepository);

// Simplified services interface for demo
interface Services {
  productService: any;
  userService: any;
  cartService: any;
  orderService: any;
  paymentService: any;
  notificationService: any;
}

// Create context
const ServiceContext = createContext<Services | undefined>(undefined);

// Mock services for demonstration
const mockServices: Services = {
  productService: {
    getProducts: () => Promise.resolve([]),
    getProduct: (id: string) => Promise.resolve(null),
    getCategories: () => Promise.resolve([]),
  },
  userService: {
    getCurrentUser: () => Promise.resolve(null),
    login: () => Promise.resolve(null),
    register: () => Promise.resolve(null),
  },
  cartService: {
    getCart: () => Promise.resolve(null),
    addToCart: () => Promise.resolve(null),
    updateCartItem: () => Promise.resolve(null),
  },
  orderService: {
    getOrders: () => Promise.resolve([]),
    getOrder: (id: string) => Promise.resolve(null),
    createOrder: () => Promise.resolve(null),
  },
  paymentService: {
    processPayment: () => Promise.resolve(null),
    getPaymentMethods: () => Promise.resolve([]),
  },
  notificationService: {
    sendNotification: () => Promise.resolve(null),
    getNotifications: () => Promise.resolve([]),
  },
};

// Provider component
interface ServiceProviderProps {
  children: ReactNode;
}

export function ServiceProvider({ children }: ServiceProviderProps) {
  return (
    <ServiceContext.Provider value={mockServices}>
      {children}
    </ServiceContext.Provider>
  );
}

// Custom hook to use services
export function useServices(): Services {
  const context = useContext(ServiceContext);
  if (context === undefined) {
    throw new Error('useServices must be used within a ServiceProvider');
  }
  return context;
}
