import api from './api';

// Типы данных
export interface Category {
  id: number;
  name: string;
  slug: string;
  parent_id: number | null;
  order: number;
  is_active: boolean;
  products_count?: number;
  children?: Category[];
}

export interface ProductImage {
  id: number;
  url: string;
  is_primary: boolean;
  product_id: number;
}

export interface ProductVariant {
  id: number;
  sku: string;
  size: string;
  color: string;
  price: number;
  stock: number;
  product_id: number;
}

export interface Product {
  id: number;
  name: string;
  slug: string;
  description: string;
  price: number;
  sku: string;
  stock: number;
  is_active: boolean;
  category_id: number;
  category?: Category;
  images?: ProductImage[];
  variants?: ProductVariant[];
}

// Сервисы для работы с категориями
export const categoryService = {
  // Получить все категории в виде дерева
  getCategories: async (): Promise<Category[]> => {
    const response = await api.get('/catalog/categories');
    return response.data;
  },

  // Создать новую категорию
  createCategory: async (category: Omit<Category, 'id'>): Promise<Category> => {
    const response = await api.post('/catalog/categories', category);
    return response.data;
  },

  // Обновить категорию
  updateCategory: async (id: number, category: Partial<Category>): Promise<Category> => {
    const response = await api.put(`/catalog/categories/${id}`, category);
    return response.data;
  },

  // Удалить категорию
  deleteCategory: async (id: number): Promise<void> => {
    await api.delete(`/catalog/categories/${id}`);
  }
};

// Сервисы для работы с товарами
export const productService = {
  // Получить список товаров с фильтрацией
  getProducts: async (params?: {
    skip?: number;
    limit?: number;
    category_id?: number;
    search?: string;
    min_price?: number;
    max_price?: number;
    is_active?: boolean;
  }): Promise<Product[]> => {
    const response = await api.get('/catalog/products', { params });
    return response.data;
  },

  // Получить детали товара по ID
  getProductById: async (id: number): Promise<Product> => {
    try {
      const response = await api.get(`/catalog/products/${id}`);
      
      // Проверяем структуру ответа
      if (response.data && response.data.product) {
        // Если ответ содержит вложенный объект product, используем его
        const product = response.data.product;
        
        // Добавляем изображения и варианты из ответа
        if (response.data.images && Array.isArray(response.data.images)) {
          product.images = response.data.images;
        }
        
        if (response.data.variants && Array.isArray(response.data.variants)) {
          product.variants = response.data.variants;
        }
        
        return product;
      } else {
        // Если структура ответа другая, возвращаем как есть
        return response.data;
      }
    } catch (error) {
      console.error('Ошибка при получении продукта:', error);
      throw error;
    }
  },

  // Создать новый товар
  createProduct: async (product: Omit<Product, 'id'>): Promise<Product> => {
    const response = await api.post('/catalog/products', product);
    return response.data;
  },

  // Обновить товар
  updateProduct: async (id: number, product: Partial<Product>): Promise<Product> => {
    const response = await api.put(`/catalog/products/${id}`, product);
    return response.data;
  },

  // Удалить товар
  deleteProduct: async (id: number): Promise<void> => {
    await api.delete(`/catalog/products/${id}`);
  },

  // Загрузить изображение товара
  uploadProductImage: async (productId: number, file: File, isPrimary: boolean): Promise<ProductImage> => {
    const formData = new FormData();
    formData.append('file', file);
    formData.append('is_primary', isPrimary.toString());
    
    const response = await api.post(`/catalog/products/${productId}/images`, formData, {
      headers: {
        'Content-Type': 'multipart/form-data',
      },
    });
    
    return response.data;
  },

  // Обновить изображение товара
  updateProductImage: async (imageId: number, data: { is_primary: boolean }): Promise<ProductImage> => {
    const response = await api.put(`/catalog/images/${imageId}`, data);
    return response.data;
  },

  // Удалить изображение товара
  deleteProductImage: async (imageId: number): Promise<void> => {
    await api.delete(`/catalog/images/${imageId}`);
  },

  // Добавить вариант товара
  addProductVariant: async (productId: number, variant: Omit<ProductVariant, 'id' | 'product_id'>): Promise<ProductVariant> => {
    const response = await api.post(`/catalog/products/${productId}/variants`, variant);
    return response.data;
  },

  // Обновить вариант товара
  updateProductVariant: async (variantId: number, variant: Partial<ProductVariant>): Promise<ProductVariant> => {
    const response = await api.put(`/catalog/variants/${variantId}`, variant);
    return response.data;
  },

  // Удалить вариант товара
  deleteProductVariant: async (variantId: number): Promise<void> => {
    await api.delete(`/catalog/variants/${variantId}`);
  }
}; 