<?php

namespace App\Services;

use App\Models\User;
use App\Models\Product;
use App\Models\InvestmentProduct;
use App\Models\Order;
use Illuminate\Support\Facades\Log;

class InvestmentProductService
{
    /**
     * Obtenir le produit d'investissement obligatoire (depuis la table investment_products)
     */
    public function getInvestmentProduct(): ?InvestmentProduct
    {
        // Retourner le premier produit d'investissement actif
        return InvestmentProduct::where('is_active', true)
            ->orderBy('order', 'asc')
            ->first();
    }

    /**
     * Vérifier si l'utilisateur a payé son produit d'investissement
     */
    public function hasUserPaidInvestment(User $user): bool
    {
        return $user->has_paid_investment_product === true;
    }

    /**
     * Bloquer l'accès à la boutique si le produit d'investissement n'est pas payé
     */
    public function checkInvestmentProductRequirement(User $user): bool
    {
        return $this->hasUserPaidInvestment($user);
    }

    /**
     * Marquer le produit d'investissement comme payé
     */
    public function markInvestmentProductAsPaid(User $user, Order $order): bool
    {
        if ($user->has_paid_investment_product) {
            Log::info('Produit d\'investissement déjà payé', [
                'user_id' => $user->id,
                'user_name' => $user->name,
                'order_id' => $order->id,
            ]);
            return false;
        }

        $user->update([
            'has_paid_investment_product' => true,
            'investment_product_paid_at' => now(),
        ]);

        Log::info('✅ Produit d\'investissement marqué comme payé', [
            'user_id' => $user->id,
            'user_name' => $user->name,
            'order_id' => $order->id,
            'order_number' => $order->order_number,
            'amount' => $order->total_amount . ' XOF',
        ]);

        return true;
    }

    /**
     * Obtenir les messages d'erreur pour l'utilisateur
     */
    public function getInvestmentProductMessage(User $user): string
    {
        if (!$this->hasUserPaidInvestment($user)) {
            $product = $this->getInvestmentProduct();
            $price = $product ? number_format($product->price, 0, ',', ' ') : '25 000';
            
            return "Vous devez d'abord payer votre produit d'investissement obligatoire ({$price} XOF) avant d'accéder à la boutique.";
        }

        return "";
    }

    /**
     * Créer une commande pour le produit d'investissement
     * 
     * @param User $user
     * @param int|null $productId ID spécifique du produit d'investissement (optionnel)
     * @param array $shippingData Données de livraison et paiement
     * @return array Résultat de la création
     */
    public function createInvestmentProductOrder(User $user, ?int $productId = null, array $shippingData = []): array
    {
        try {
            // Si un ID est fourni, récupérer ce produit spécifique
            if ($productId) {
                $product = InvestmentProduct::where('is_active', true)->find($productId);
            } else {
                $product = $this->getInvestmentProduct();
            }

            if (!$product) {
                Log::warning('Produit d\'investissement non configuré', [
                    'user_id' => $user->id,
                    'requested_product_id' => $productId,
                ]);
                return [
                    'success' => false,
                    'message' => __('messages.investment.product_not_found') ?? 'Produit d\'investissement non configuré',
                ];
            }

            // Calculer le total avec les frais de livraison
            $shippingFee = (float) ($shippingData['shipping_fee'] ?? 0);
            $total = $product->price + $shippingFee;

            $order = Order::create([
                'user_id' => $user->id,
                'order_number' => 'INVEST-' . strtoupper(uniqid()) . '-' . time(),
                'subtotal' => $product->price,
                'discount_amount' => 0,
                'shipping_fee' => $shippingFee,
                'total' => $total,
                'total_amount' => $total,
                'status' => 'pending',
                'payment_status' => 'pending',
                'payment_method' => $shippingData['payment_method'] ?? 'flutterwave',
                'order_type' => 'investment',
                'notes' => 'Produit d\'investissement obligatoire: ' . $product->name,
                'investment_product_id' => $product->id,
                // Données client et livraison
                'customer_name' => $shippingData['customer_name'] ?? $user->name,
                'customer_email' => $shippingData['customer_email'] ?? $user->email,
                'customer_phone' => $shippingData['customer_phone'] ?? $user->phone,
                'shipping_address' => $shippingData['shipping_address'] ?? null,
                'shipping_city' => $shippingData['shipping_city'] ?? null,
                'shipping_district' => $shippingData['shipping_district'] ?? null,
                'shipping_country' => $shippingData['shipping_country'] ?? null,
            ]);

            Log::info('Commande produit d\'investissement créée', [
                'user_id' => $user->id,
                'user_name' => $user->name,
                'order_id' => $order->id,
                'order_number' => $order->order_number,
                'investment_product_id' => $product->id,
                'investment_product_name' => $product->name,
                'subtotal' => $product->price . ' XOF',
                'shipping_fee' => $shippingFee . ' XOF',
                'total' => $total . ' XOF',
            ]);

            return [
                'success' => true,
                'order_id' => $order->id,
                'order' => $order->load('user'),
            ];
            
        } catch (\Exception $e) {
            Log::error('Investment order creation error', [
                'user_id' => $user->id,
                'error' => $e->getMessage(),
                'file' => $e->getFile(),
                'line' => $e->getLine(),
            ]);
            
            return [
                'success' => false,
                'message' => 'Erreur lors de la création de la commande d\'investissement',
            ];
        }
    }
}
