/home/brandsfa/bigshoponly.com/app/Http/Controllers/Web/CartController.php
<?php

namespace App\Http\Controllers\Web;


use App\Utils\Helpers;
use App\Http\Controllers\Controller;
use App\Models\Cart;
use App\Models\Color;
use App\Models\OrderDetail;
use App\Models\Product;
use App\Utils\CartManager;
use App\Utils\OrderManager;
use App\Utils\ProductManager;
use Illuminate\Http\Request;

class CartController extends Controller
{
    public function __construct(
        private OrderDetail $order_details,
        private Product $product,
    ) {

    }
    public function variant_price(Request $request)
    {
        $product = Product::find($request->id);
        $productVariationCode = $request['product_variation_code'];
        $str = '';
        $quantity = 0;
        $price = 0;
        $color_name = '';
        $requestQuantity = $request['quantity'];

        if ($request->has('color')) {
            $str = Color::where('code', $request['color'])->first()->name;
        }

        foreach (json_decode(Product::find($request->id)->choice_options) as $key => $choice) {
            if ($str != null) {
                $str .= '-' . str_replace(' ', '', $request[$choice->name]);
            } else {
                $str .= str_replace(' ', '', $request[$choice->name]);
            }
        }

        $requestQuantity = $productVariationCode != $str ? $product['minimum_order_qty'] : $request['quantity'];
        $inCartExistStatus = 0;
        $inCartExistKey = null;
        $getCartList = \App\Utils\CartManager::get_cart();
        foreach ($getCartList as $cartItem) {
            if ($cartItem['product_id'] == $product['id'] && $cartItem['variant'] == $str) {
                $inCartExistStatus = 1;
                $inCartExistKey = $cartItem['id'];
                $requestQuantity = $productVariationCode == $str ? $request['quantity'] : $cartItem['quantity'];
            }
        }

        if ($str != null) {
            $count = count(json_decode($product->variation));
            for ($i = 0; $i < $count; $i++) {
                if (json_decode($product->variation)[$i]->type == $str) {
                    $tax = $product->tax_model=='exclude' ? Helpers::tax_calculation(product: $product, price: json_decode($product->variation)[$i]->price, tax: $product['tax'], tax_type: $product['tax_type']):0;
                    $update_tax = $tax * $requestQuantity;
                    $discount = Helpers::get_product_discount($product, json_decode($product->variation)[$i]->price);
                    $price = json_decode($product->variation)[$i]->price - $discount + $tax;
                    $discountedUnitPrice = json_decode($product->variation)[$i]->price - $discount;
                    $unit_price = json_decode($product->variation)[$i]->price;
                    $quantity = json_decode($product->variation)[$i]->qty;
                }
            }
        } else {
            $tax = $product->tax_model=='exclude' ? Helpers::tax_calculation(product: $product, price: $product->unit_price, tax: $product['tax'], tax_type: $product['tax_type']) : 0;
            $update_tax = $tax * $requestQuantity;
            $discount = Helpers::get_product_discount($product, $product->unit_price);
            $price = $product->unit_price - $discount + $tax;
            $discountedUnitPrice = $product->unit_price - $discount;
            $unit_price = $product->unit_price;
            $quantity = $product->current_stock;
        }

        $delivery_info = [];

        $stock_limit = 0;
        if(theme_root_path() == 'theme_fashion') {
            $delivery_info = ProductManager::get_products_delivery_charge($product, $requestQuantity);
            $stock_limit= \App\Models\BusinessSetting::where('type','stock_limit')->first()->value;
            if ($request->has('color')) {
                $color_name = Color::where(['code'=>$request->color])->first()->name;
            }
        }

        return [
            'price' => \App\Utils\Helpers::currency_converter($price * $requestQuantity),
            'discount' => \App\Utils\Helpers::currency_converter($discount),
            'discount_amount' => $discount,
            'tax' => $product->tax_model=='exclude' ? \App\Utils\Helpers::currency_converter($tax) : 'incl.',
            'update_tax' => $product->tax_model=='exclude' ? \App\Utils\Helpers::currency_converter($update_tax) : 'incl.', // for others theme
            'quantity' => $product['product_type'] == 'physical' ? $quantity : 100,
            'delivery_cost' => isset($delivery_info['delivery_cost']) ? \App\Utils\Helpers::currency_converter($delivery_info['delivery_cost']):0,
            'unit_price'=>\App\Utils\Helpers::currency_converter($price), //fashion theme
            'total_unit_price'=>\App\Utils\Helpers::currency_converter($unit_price), //fashion theme
            'discounted_unit_price'=>\App\Utils\Helpers::currency_converter($discountedUnitPrice), //fashion theme
            'color_name'=>$color_name,
            'stock_limit'=>$stock_limit,

            'in_cart_status' => $inCartExistStatus,
            'in_cart_quantity' => $requestQuantity,
            'in_cart_key' => $inCartExistKey,
            'variation_code' => $str,
        ];
    }

    public function addToCart(Request $request)
    {
        $cart = CartManager::add_to_cart($request);
        // dd($cart);
        session()->forget('coupon_code');
        session()->forget('coupon_type');
        session()->forget('coupon_bearer');
        session()->forget('coupon_discount');
        session()->forget('coupon_seller_id');
        return response()->json($cart);
    }

    public function updateNavCart()
    {
        return response()->json(['data' => view(VIEW_FILE_NAMES['products_cart_partials'])->render(), 'mobile_nav' => view(VIEW_FILE_NAMES['products_mobile_nav_partials'])->render()]);
    }
    /**
     * For theme fashion flaoting nav
     */
    public function update_floating_nav()
    {
        return response()->json(['floating_nav' => view(VIEW_FILE_NAMES['products_floating_nav_partials'])->render()]);
    }

    /**
     * removes from Cart
     */
    public function removeFromCart(Request $request)
    {
        $user = Helpers::get_customer();

        Cart::where(['id' => $request->key, 'customer_id' => ($user == 'offline' ? session('guest_id') : auth('customer')->id())])->delete();

        session()->forget('coupon_code');
        session()->forget('coupon_type');
        session()->forget('coupon_bearer');
        session()->forget('coupon_discount');
        session()->forget('coupon_seller_id');
        session()->forget('shipping_method_id');
        session()->forget('order_note');

        return response()->json(['data' => view(VIEW_FILE_NAMES['products_cart_details_partials'], compact('request'))->render(), 'message'=>translate('Item_has_been_removed_from_cart')]);
    }

    //updated the quantity for a cart item
    public function updateQuantity(Request $request)
    {
        $response = CartManager::update_cart_qty($request);
        // dd($response);

        session()->forget('coupon_code');
        session()->forget('coupon_type');
        session()->forget('coupon_bearer');
        session()->forget('coupon_discount');
        session()->forget('coupon_seller_id');

        if ($response['status'] == 0) {
            return response()->json($response);
        }
        return response()->json(view(VIEW_FILE_NAMES['products_cart_details_partials_order_summury'], compact('request'))->render());
    }

    //updated the quantity for a cart item
    public function updateQuantity_guest(Request $request)
    {
        $sub_total=0;
        $response = CartManager::update_cart_qty($request);
        $cart=CartManager::get_cart();
        session()->forget('coupon_code');
        session()->forget('coupon_type');
        session()->forget('coupon_bearer');
        session()->forget('coupon_discount');
        session()->forget('coupon_seller_id');

        $product = Cart::find($request->key);
        $quantity_price = Helpers::currency_converter($product['price']*(int)$product['quantity']);
        $discount_price = Helpers::currency_converter(($product['price']-$product['discount'])*(int)$product['quantity']);
        $total_discount = 0;
        foreach($cart as $cartItem)
        {
            $sub_total+=($cartItem['price']-$cartItem['discount'])*$cartItem['quantity'];
            $total_discount+=$cartItem['discount']*$cartItem['quantity'];
        }
        $total_price = Helpers::currency_converter($sub_total);
        $total_discount_price = Helpers::currency_converter($total_discount);

        if ($response['status'] == 0) {
            return response()->json([
                'status'=>$response['status'],
                'message'=> $response['message'],
                'qty'=>$response['status'] == 0 ? $response['qty']:$request->quantity,
            ]);
        }
        /** for default theme nav cart ,showing free delivery amount */
        $free_delivery_status = OrderManager::free_delivery_order_amount($cart[0]->cart_group_id);

        return response()->json([
            'status'=>$response['status'],
            'message'=> translate('successfully_updated!'),
            'qty'=>$response['status'] == 0 ? $response['qty']:$request->quantity,
            'total_price'=>$total_price,
            'discount_price'=>$discount_price,
            'quantity_price'=>$quantity_price,
            'total_discount_price'=>$total_discount_price,
            'free_delivery_status'=>$free_delivery_status,
            'in_cart_key'=>$product['id'],
        ]);
    }

    public function order_again(Request $request){
        $data = OrderManager::order_again($request);
        $order_product_count = $data['order_product_count'];
        $add_to_cart_count = $data['add_to_cart_count'];

        if($order_product_count == $add_to_cart_count){
            session()->forget('coupon_code');
            session()->forget('coupon_type');
            session()->forget('coupon_bearer');
            session()->forget('coupon_discount');
            session()->forget('coupon_seller_id');
            session()->forget('shipping_method_id');
            session()->forget('order_note');

            if (auth('customer')->check()) {
                return [
                    'status' => 1,
                    'redirect_url' => route('shop-cart'),
                    'message' => translate('added_to_cart_successfully!')
                ];
            }else{
                return response()->json(['message' => 'Added to cart successfully'], 200);
            }
        }elseif($add_to_cart_count>0){
            if (auth('customer')->check()) {
                return [
                    'status' => 1,
                    'redirect_url' => route('shop-cart'),
                    'message' => translate($add_to_cart_count.'_item_added_to_cart_successfully!')
                ];
            }else{
                return response()->json(['message' => $add_to_cart_count.' item added to cart successfully!'], 200);
            }

        }{
            if (auth('customer')->check()) {
                return [
                    'status' => 0,
                    'message' => translate('all_items_were_not_added_to_cart_as_they_are_currently_unavailable_for_purchase!')
                ];
            }else{
                return response()->json(['message' => 'All items were not added to cart as they are currently unavailable for purchase'], 403);
            }

        }
    }

    function update_variation(Request $request){
        $product = Product::find($request->product_id);
        $user = Helpers::get_customer($request);
        $str = '';
        $variations = [];
        $price = 0;
        $discount = 0;
        if ($request->has('color')) {
            $str = Color::where('code', $request['color'])->first()->name;
            $variations['color'] = $str;
        }

        //Gets all the choice values of customer choice option and generate a string like Black-S-Cotton
        $choices = [];
        foreach (json_decode($product->choice_options) as $key => $choice) {

            $choices[$choice->name] = $request[$choice->name];
            $variations[$choice->title] = $request[$choice->name];
            if ($str != null) {
                $str .= '-' . str_replace(' ', '', $request[$choice->name]);
            } else {
                $str .= str_replace(' ', '', $request[$choice->name]);
            }
        }

        if ($str != null) {
            $count = count(json_decode($product->variation));
            for ($i = 0; $i < $count; $i++) {
                if (json_decode($product->variation)[$i]->type == $str) {
                    $tax = $product->tax_model=='exclude' ? Helpers::tax_calculation(product: $product, price: json_decode($product->variation)[$i]->price, tax: $product['tax'], tax_type: $product['tax_type']):0;
                    $discount = Helpers::get_product_discount($product, json_decode($product->variation)[$i]->price);
                    $price = json_decode($product->variation)[$i]->price - $discount + $tax;
                    $quantity = json_decode($product->variation)[$i]->qty;
                }
            }
        } else {
            $tax = $product->tax_model=='exclude' ? Helpers::tax_calculation(product: $product, price:  $product->unit_price, tax: $product['tax'], tax_type: $product['tax_type']) : 0;
            $discount = Helpers::get_product_discount($product, $product->unit_price);
            $price = $product->unit_price - $discount + $tax;
            $quantity = $product->current_stock;
        }
        $cart = Cart::where([
            'product_id' => $request->product_id,
            'customer_id' => $user == 'offline' ? session('guest_id') : $user->id,
            'is_guest' => $user == 'offline' ? 1 : '0',
            'variant' => $str
        ])->first();
        if (isset($cart) == false) {
            $cart = Cart::find($request->id);
            $cart['color']          = $request->has('color') ? $request['color'] : null;
            $cart['choices']        = json_encode($choices);

            $cart['variations']     = json_encode($variations);
            $cart['variant']        = $str;

            //Check the string and decreases quantity for the stock
            if ($str != null) {
                $count = count(json_decode($product->variation));
                for ($i = 0; $i < $count; $i++) {
                    if (json_decode($product->variation)[$i]->type == $str) {
                        $price = json_decode($product->variation)[$i]->price;
                        if (json_decode($product->variation)[$i]->qty < $request['quantity']) {
                            return [
                                'status' => 0,
                                'message' => translate('out_of_stock!')
                            ];
                        }
                    }
                }
            } else {
                $price = $product->unit_price;
            }
            $cart['price'] = $price;
            $cart['discount'] = $discount;
            $cart['tax'] = $tax;
            $cart['quantity'] = $request['quantity'];
            $cart->save();

            return [
                'status' => 1,
                'message' => translate('successfully_added!'),
                'price' => \App\Utils\Helpers::currency_converter($price),
                'discount' => \App\Utils\Helpers::currency_converter($discount*$request['quantity']),
                'data' => view(VIEW_FILE_NAMES['products_cart_details_partials'], compact('request'))->render()
            ];
        } else {
            return [
                'status' => 0,
                'message' => translate('already_added!')
            ];
        }
    }
    public function remove_all_cart(){
        $user = Helpers::get_customer();

        Cart::where([
            'customer_id'=> ($user == 'offline' ? session('guest_id') : auth('customer')->id()),
            'is_guest' => ($user == 'offline' ? 1 : '0'),
        ])->delete();
        return redirect()->back();
    }
    
    public function updateShippingOnly(Request $request)
{
    // BusinessSetting থেকে ভ্যালু নিন (int কাস্ট করুন)
    $inside  = (int) \App\Models\BusinessSetting::where('type','inside_dhaka')->value('value');
    $outside = (int) \App\Models\BusinessSetting::where('type','outside_dhaka')->value('value');

    // ইনপুট শিপিং কস্ট (70/100 বা যেটা কনফিগে আছে)
    $shipping_cost_input = (int) $request->input('shipping_cost', $inside ?: $outside);
    if (!in_array($shipping_cost_input, [$inside, $outside], true)) {
        // আপনি যেভাবে পাঠাচ্ছেন সেভাবেই রাখতে চাইলে:
        $shipping_cost_input = (int) $request->shipping_cost;
    }

    // কাস্টমার/গেস্ট নির্ধারণ
    $user      = Helpers::get_customer($request);
    $guest_id  = (int) (session('guest_id') ?? ($request->guest_id ?? 0));
    $customerId = ($user && $user !== 'offline') ? (int) $user->id : $guest_id;

    // কার্ট আইটেমগুলো নিন (first() নয়)
    $query = Cart::where('customer_id', $customerId);

    // কার্ট খালি হলে সেফ রেসপন্স
    if (!$query->exists()) {
        return response()->json([
            'status'  => 0,
            'message' => translate('cart_is_empty'),
            'shipping_cost' => $shipping_cost_input,
        ]);
    }

    // অপশন A: bulk update (একটাই DB কুয়েরি)
    $query->update(['shipping_cost' => $shipping_cost_input]);

    // অপশন B: model event/observer দরকার হলে (bulk-এর বদলে এটি ব্যবহার করুন)
    /*
    foreach ($query->get() as $cart) {
        $cart->shipping_cost = $shipping_cost_input;
        $cart->save();
    }
    */

        session()->forget('coupon_code');
        session()->forget('coupon_type');
        session()->forget('coupon_bearer');
        session()->forget('coupon_discount');
        session()->forget('coupon_seller_id');
        
    return response()->json([
        'status'        => 1,
        'shipping_cost' => $shipping_cost_input,
        'message'       => translate('successfully_updated!'),
        'data' => view(VIEW_FILE_NAMES['products_cart_details_partials_order_summury'], compact('request'))->render()
    ]);
    
    // return response()->json();
    
        // $order_summary_html = view(VIEW_FILE_NAMES['products_cart_details_partials_order_summury'], compact('request'))->render();

    // return response()->json([
    //     'status' => 1,
    //     'message' => translate('successfully_updated!'),
    //     'shipping_cost' => Helpers::currency_converter($shipping_cost_input),
    //     'data' => $order_summary_html,
    // ]);
}

}