/// Data Source: Products Local Data Source
///
/// Provides mock product and category data for development.
/// In production, this would be replaced with actual API calls.
library;

import 'package:worker/features/products/data/models/category_model.dart';
import 'package:worker/features/products/data/models/product_model.dart';

/// Products Local Data Source Interface
abstract class ProductsLocalDataSource {
  Future<List<ProductModel>> getAllProducts();
  Future<List<ProductModel>> searchProducts(String query);
  Future<List<ProductModel>> getProductsByCategory(String categoryId);
  Future<ProductModel> getProductById(String id);
  Future<List<CategoryModel>> getCategories();
}

/// Products Local Data Source Implementation
///
/// Provides mock data for products and categories.
/// Simulates async operations with delays.
class ProductsLocalDataSourceImpl implements ProductsLocalDataSource {
  const ProductsLocalDataSourceImpl();

  /// Mock categories data
  static final List<Map<String, dynamic>> _categoriesJson = [
    {
      'id': 'all',
      'name': 'Tất cả',
      'description': 'Tất cả sản phẩm',
      'icon': '📦',
      'order': 0,
    },
    {
      'id': 'floor_tiles',
      'name': 'Gạch lát nền',
      'description': 'Gạch lát nền cao cấp',
      'icon': '🏠',
      'order': 1,
    },
    {
      'id': 'wall_tiles',
      'name': 'Gạch ốp tường',
      'description': 'Gạch ốp tường chất lượng',
      'icon': '🧱',
      'order': 2,
    },
    {
      'id': 'decorative_tiles',
      'name': 'Gạch trang trí',
      'description': 'Gạch trang trí nghệ thuật',
      'icon': '✨',
      'order': 3,
    },
    {
      'id': 'outdoor_tiles',
      'name': 'Gạch ngoài trời',
      'description': 'Gạch chống trượt ngoài trời',
      'icon': '🌳',
      'order': 4,
    },
    {
      'id': 'accessories',
      'name': 'Phụ kiện',
      'description': 'Phụ kiện xây dựng',
      'icon': '🔧',
      'order': 5,
    },
  ];

  /// Mock products data
  static final List<Map<String, dynamic>> _productsJson = [
    {
      'product_id': 'prod_001',
      'name': 'Gạch Cát Tường 1200x1200',
      'description':
          'Gạch men bóng kiếng cao cấp, chống trượt, độ bền cao. Phù hợp cho phòng khách, phòng ngủ.',
      'base_price': 450000.0,
      'unit': 'm²',
      'images': [
        'https://www.eurotile.vn/pictures/catalog/product/0-gachkholon/cat-tuong/CAT-S01G-1.jpg',
      ],
      'image_captions': {},
      'link_360':
          'https://design.eurotile.vn/pub/tool/panorama/show?obsPlanId=3FO3H1VE59R5&locale=en_US',
      'specifications': {},
      'category': 'floor_tiles',
      'brand': 'Eurotile',
      'is_active': true,
      'is_featured': false,
      'erpnext_item_code': null,
      'created_at': '2024-01-15T08:00:00Z',
      'updated_at': null,
    },
    {
      'product_id': 'prod_002',
      'name': 'Gạch granite nhập khẩu',
      'description':
          'Gạch granite nhập khẩu Tây Ban Nha, vân đá tự nhiên, sang trọng. Kích thước 80x80cm.',
      'base_price': 680000.0,
      'unit': 'm²',
      'images': [
        'https://images.unsplash.com/photo-1565193566173-7a0ee3dbe261?w=300&h=300&fit=crop',
      ],
      'image_captions': {},
      'link_360':
          'https://design.eurotile.vn/pub/tool/panorama/show?obsPlanId=3FO3H1VE59R&locale=en_US',
      'specifications': {},
      'category': 'floor_tiles',
      'brand': 'Vasta Stone',
      'is_active': true,
      'is_featured': false,
      'erpnext_item_code': null,
      'created_at': '2024-01-20T10:30:00Z',
      'updated_at': null,
    },
    {
      'product_id': 'prod_003',
      'name': 'Gạch mosaic trang trí',
      'description':
          'Gạch mosaic thủy tinh màu sắc đa dạng, tạo điểm nhấn cho không gian. Kích thước 30x30cm.',
      'base_price': 320000.0,
      'unit': 'm²',
      'images': [
        'https://images.unsplash.com/photo-1615971677499-5467cbab01c0?w=300&h=300&fit=crop',
      ],
      'image_captions': {},
      'link_360':
          'https://design.eurotile.vn/pub/tool/panorama/show?obsPlanId=3FO3H1VE59R5&locale=en_US',
      'specifications': {},
      'category': 'decorative_tiles',
      'brand': 'Eurotile',
      'is_active': true,
      'is_featured': false,
      'erpnext_item_code': null,
      'created_at': '2024-02-01T14:15:00Z',
      'updated_at': null,
    },
    {
      'product_id': 'prod_004',
      'name': 'Gạch 3D họa tiết',
      'description':
          'Gạch 3D với họa tiết nổi độc đáo, tạo hiệu ứng thị giác ấn tượng cho tường phòng khách.',
      'base_price': 750000.0,
      'unit': 'm²',
      'images': [
        'https://images.unsplash.com/photo-1600566753190-17f0baa2a6c3?w=300&h=300&fit=crop',
      ],
      'image_captions': {},
      'link_360':
          'https://design.eurotile.vn/pub/tool/panorama/show?obsPlanId=3FO3H1VE59R5&locale=en_US',
      'specifications': {},
      'category': 'wall_tiles',
      'brand': 'Vasta Stone',
      'is_active': true,
      'is_featured': false,
      'erpnext_item_code': null,
      'created_at': '2024-02-10T09:00:00Z',
      'updated_at': null,
    },
    {
      'product_id': 'prod_005',
      'name': 'Gạch ceramic chống trượt',
      'description':
          'Gạch ceramic chống trượt cấp độ R11, an toàn cho phòng tắm và ban công. Kích thước 40x40cm.',
      'base_price': 380000.0,
      'unit': 'm²',
      'images': [
        'https://images.unsplash.com/photo-1615874694520-474822394e73?w=300&h=300&fit=crop',
      ],
      'image_captions': {},
      'link_360':
          'https://design.eurotile.vn/pub/tool/panorama/show?obsPlanId=3FO3H1VE59R5&locale=en_US',
      'specifications': {},
      'category': 'outdoor_tiles',
      'brand': 'Eurotile',
      'is_active': true,
      'is_featured': false,
      'erpnext_item_code': null,
      'created_at': '2024-02-15T11:20:00Z',
      'updated_at': null,
    },
    {
      'product_id': 'prod_006',
      'name': 'Gạch terrazzo đá mài',
      'description':
          'Gạch terrazzo phong cách retro, đá mài hạt màu, độc đáo và bền đẹp theo thời gian.',
      'base_price': 890000.0,
      'unit': 'm²',
      'images': [
        'https://images.unsplash.com/photo-1564013799919-ab600027ffc6?w=300&h=300&fit=crop',
      ],
      'image_captions': {},
      'link_360': null,
      'specifications': {},
      'category': 'decorative_tiles',
      'brand': 'Vasta Stone',
      'is_active': true,
      'is_featured': false,
      'erpnext_item_code': null,
      'created_at': '2024-02-20T15:45:00Z',
      'updated_at': null,
    },
  ];

  @override
  Future<List<ProductModel>> getAllProducts() async {
    // Simulate network delay
    await Future.delayed(const Duration(milliseconds: 500));

    return _productsJson.map((json) => ProductModel.fromJson(json)).toList();
  }

  @override
  Future<List<ProductModel>> searchProducts(String query) async {
    // Simulate network delay
    await Future.delayed(const Duration(milliseconds: 300));

    final lowercaseQuery = query.toLowerCase();

    final filtered = _productsJson.where((product) {
      final name = (product['name'] as String).toLowerCase();
      final sku = (product['sku'] as String).toLowerCase();
      final description = (product['description'] as String).toLowerCase();

      return name.contains(lowercaseQuery) ||
          sku.contains(lowercaseQuery) ||
          description.contains(lowercaseQuery);
    }).toList();

    return filtered.map((json) => ProductModel.fromJson(json)).toList();
  }

  @override
  Future<List<ProductModel>> getProductsByCategory(String categoryId) async {
    // Simulate network delay
    await Future.delayed(const Duration(milliseconds: 400));

    if (categoryId == 'all') {
      return getAllProducts();
    }

    final filtered = _productsJson
        .where((product) => product['categoryId'] == categoryId)
        .toList();

    return filtered.map((json) => ProductModel.fromJson(json)).toList();
  }

  @override
  Future<ProductModel> getProductById(String id) async {
    // Simulate network delay
    await Future.delayed(const Duration(milliseconds: 200));

    final productJson = _productsJson.firstWhere(
      (product) => product['id'] == id,
      orElse: () => throw Exception('Product not found: $id'),
    );

    return ProductModel.fromJson(productJson);
  }

  @override
  Future<List<CategoryModel>> getCategories() async {
    // Simulate network delay
    await Future.delayed(const Duration(milliseconds: 300));

    return _categoriesJson.map((json) => CategoryModel.fromJson(json)).toList();
  }
}
