import 'dart:convert';
import 'package:http/http.dart' as http;
import '../providers/cart_provider.dart';
import 'woocommerce_service.dart';

/// Service für WooCommerce Checkout-Funktionalität
/// 
/// Dieser Service bietet Methoden für den Checkout-Prozess.
/// Für die einfachste Lösung wird die WebView-basierte Checkout-Seite verwendet,
/// die alle WooCommerce-Einstellungen automatisch nutzt.
class WooCommerceCheckoutService {
  static const String baseUrl = WooCommerceService.baseUrl;
  static const String consumerKey = WooCommerceService.consumerKey;
  static const String consumerSecret = WooCommerceService.consumerSecret;

  /// Erstellt eine Checkout-URL mit Warenkorb-Produkten
  /// 
  /// Diese Methode erstellt eine URL, die direkt zur WooCommerce Checkout-Seite
  /// führt und die Produkte aus dem Warenkorb automatisch hinzufügt.
  static String buildCheckoutUrl(CartProvider cart) {
    if (cart.items.isEmpty) {
      return '$baseUrl/checkout/';
    }

    // Erstelle eine URL, die alle Produkte zum Warenkorb hinzufügt
    // Format: /checkout/?add-to-cart=ID1,ID2,ID3
    final productIds = cart.items
        .map((item) => '${item.product.id}:${item.quantity}')
        .join(',');

    // Alternative: Verwende die WooCommerce Cart-Seite und leite dann weiter
    // Oder direkt zur Checkout-Seite mit Produkten
    return '$baseUrl/checkout/?add-to-cart=${cart.items.map((item) => item.product.id).join(',')}';
  }

  /// Erstellt eine Order über die WooCommerce REST API
  /// 
  /// Diese Methode kann verwendet werden, wenn du einen nativen Checkout
  /// implementieren möchtest. Sie erfordert Write-Berechtigungen für die API Keys.
  /// 
  /// Hinweis: Für die einfachste Lösung wird die WebView-basierte Checkout-Seite
  /// empfohlen, da sie alle WooCommerce-Einstellungen (Zahlungen, Versand, etc.)
  /// automatisch nutzt.
  static Future<Map<String, dynamic>> createOrder({
    required CartProvider cart,
    required Map<String, dynamic> billing,
    Map<String, dynamic>? shipping,
    String? paymentMethod,
  }) async {
    try {
      final lineItems = cart.items.map((item) {
        return {
          'product_id': item.product.id,
          'quantity': item.quantity,
        };
      }).toList();

      final orderData = {
        'payment_method': paymentMethod ?? 'bacs',
        'payment_method_title': paymentMethod ?? 'Direktüberweisung',
        'set_paid': false,
        'billing': billing,
        'shipping': shipping ?? billing,
        'line_items': lineItems,
        'shipping_lines': [],
      };

      final uri = Uri.parse('$baseUrl/wp-json/wc/v3/orders');
      
      // Basic Auth für API
      final credentials = base64Encode(utf8.encode('$consumerKey:$consumerSecret'));
      final headers = {
        'Authorization': 'Basic $credentials',
        'Content-Type': 'application/json',
      };

      final response = await http.post(
        uri,
        headers: headers,
        body: json.encode(orderData),
      );

      if (response.statusCode == 201) {
        return json.decode(response.body);
      } else {
        throw Exception('Fehler beim Erstellen der Bestellung: ${response.statusCode} - ${response.body}');
      }
    } catch (e) {
      throw Exception('Fehler beim Checkout: $e');
    }
  }

  /// Ruft verfügbare Zahlungsmethoden ab
  static Future<List<Map<String, dynamic>>> getPaymentMethods() async {
    try {
      final uri = Uri.parse('$baseUrl/wp-json/wc/v3/payment_gateways');
      
      final credentials = base64Encode(utf8.encode('$consumerKey:$consumerSecret'));
      final headers = {
        'Authorization': 'Basic $credentials',
      };

      final response = await http.get(uri, headers: headers);

      if (response.statusCode == 200) {
        final List<dynamic> data = json.decode(response.body);
        return data
            .where((gateway) => gateway['enabled'] == true)
            .map((gateway) => {
                  return {
                    'id': gateway['id'],
                    'title': gateway['title'],
                    'description': gateway['description'],
                  };
                })
            .toList()
            .cast<Map<String, dynamic>>();
      } else {
        throw Exception('Fehler beim Laden der Zahlungsmethoden: ${response.statusCode}');
      }
    } catch (e) {
      throw Exception('Fehler beim Abrufen der Zahlungsmethoden: $e');
    }
  }

  /// Ruft Versandoptionen ab
  static Future<List<Map<String, dynamic>>> getShippingMethods() async {
    try {
      final uri = Uri.parse('$baseUrl/wp-json/wc/v3/shipping/zones');
      
      final credentials = base64Encode(utf8.encode('$consumerKey:$consumerSecret'));
      final headers = {
        'Authorization': 'Basic $credentials',
      };

      final response = await http.get(uri, headers: headers);

      if (response.statusCode == 200) {
        final List<dynamic> data = json.decode(response.body);
        return data.cast<Map<String, dynamic>>();
      } else {
        throw Exception('Fehler beim Laden der Versandoptionen: ${response.statusCode}');
      }
    } catch (e) {
      throw Exception('Fehler beim Abrufen der Versandoptionen: $e');
    }
  }
}

