<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use DB;


class PosController extends Controller
{
    public function index(Request $request)
    {
        $business_config = DB::table("settings")->first();
        return view('pos.index',array('business'=>$business_config));
    }

    public function load_cart(Request $request)
    {
        $business_config = DB::table("settings")->first();
        $userId = Auth::id();

        // Get cart items for the user and join with items table, also get parent item name
        $cart = DB::table('cart')
            ->where('cart.user_id', $userId)
            ->join('items as i', 'cart.item_id', '=', 'i.id')
            ->leftJoin('items as p', 'i.parent_id', '=', 'p.id') // self join to get parent
            ->select(
                'cart.*',
                'i.item_name',
                'i.item_image',
                'i.item_price',
                'i.item_delivery_price',
                'p.item_name as parent_item_name' // parent item name
            )
            ->get();

        $cart_data = $cart->count() > 0 ? $cart : collect(); // empty collection if no items

        return view('pos.cart', compact('cart_data','business_config'));
    }

    public function remove_item(Request $request)
    {
        $remove_id = $request->id;
        DB::table('cart')->where("id",$remove_id)->delete();
        return "Removed";
    }



    public function add_to_cart(Request $request)
    {
        $userId = Auth::id();
        $item_id = $request->item;
        $note = $request->note;
        $addons_data = $request->addons;
        $addons_total = $request->addons_total;
        if(strlen($note) < 1)
        {
            $note = '-No Notes Entered-';
        }

        $insert_array = array("user_id"=> $userId,'item_id'=>$item_id,'notes'=>$note,'addons'=>$addons_data,'addons_amount'=>$addons_total);
        DB::table("cart")->insert($insert_array);
    }

    public function load_items(Request $request)
    {
        
        $query_set = DB::table("items");
        $parent = 0;
        $is_addons = 0;
        if($request->parent)
        {
            $parent = DB::table("items")->where("id",$request->parent)->first();
            $addons_data = DB::table("addon_mappings")->where("item_id",$request->parent);
            if($addons_data->count() > 0)
            {
                $is_addons = $parent->id;
            }
            $query_set->where("parent_id",$request->parent);
            $grand_parent = $parent->parent_id;
            echo "<input type='hidden' id='grand_parent' value='$grand_parent'>" ;
            echo "<input type='hidden' id='parent_title' value='$parent->item_name'>" ;
            
        }
        else
        {
            $query_set->where("parent_id",0);
        }
        $items = $query_set->get();
        return view('pos.load_items',array("items"=>$items,'parent'=>$parent,'addon_parent'=>$is_addons));
    }

    public function showLoginForm() 
    {
        return view('pos.login');
    }

    public function loginBack(Request $request) {
        $request->validate([
            'email' => 'required|email',
            'password' => 'required|string',
        ]);

        if (Auth::attempt($request->only('email', 'password'))) 
        {
            return redirect()->route('pos.index');
        }

        return back()->withErrors([
            'email' => 'Invalid credentials.',
        ]);
    }

    public function load_adons_combo(Request $request)
    {
        if(isset($request->free_addons))
        {
            echo "<input type='hidden' id='free_toppings_count' value='$request->free_addons'>";
        }
        $secondary_item = 0;
        $item_id = $request->item_id;
        $addon_group_rules = [];
        $addon_data =  [];
        $combo_addons = DB::table("combo_addons")
    ->where("item_id", $item_id)
    ->get(['combo_items_addons', 'free_toppings']); // fetch both fields

$addon_groups_sets = [];

foreach ($combo_addons as $combo) {
    $combo_id = $combo->combo_items_addons; // actual combo item ID
    $free_toppings = $combo->free_toppings; // actual free toppings

            // get parents
            $parents = DB::table("items")
                ->where("id", $combo_id)
                ->pluck('parent_id')
                ->toArray();

            // get addon IDs from mappings
            $addons_list = DB::table("addon_mappings")
                ->whereIn("item_id", $parents)
                ->pluck('addon_id');

            // get actual addons
            $addonGroups = DB::table('addons')
                ->whereIn('id', $addons_list)
                ->get();

            $addon_groups_sets[] = [
                "set" => $addonGroups, // Collection of addons
                "item_id" => $combo_id,
                "free_toppings" => $free_toppings // now properly set
            ];
        }


        if($request->addon_id)
        {
            if($request->secondary_item && $request->secondary_item != 0)
            {
                $secondary_item = $request->secondary_item;
            }
            $groups_array = DB::table("addon_groups")->where("addon_id",$request->addon_id)->get();
            foreach($groups_array as $group_map)
            {
                $addon_group_rules["$group_map->group_name"] = $group_map;
            }
            $addon_data = DB::table('addon_mappings')
            ->leftJoin('addon_groups', 'addon_groups.id', '=', 'addon_mappings.addon_group_id')
            ->select('addon_mappings.*', 'addon_groups.group_name')
            ->where('addon_mappings.addon_id', $request->addon_id)
            ->get();

            // Initialize grouped array
            $grouped = [];

            // Loop through each item and group by group_name
            foreach ($addon_data as $item) {
                $group = $item->group_name ?? 'Ungrouped'; // Fallback if group_name is null
                if (!isset($grouped[$group])) {
                    $grouped[$group] = [];
                }
                $grouped[$group][] = [
                    'id' => $item->id,
                    'item_id' => $item->item_id,
                    'addon_name' => $item->addon_name,
                    'addon_id' => $item->addon_id,
                    'addon_group_id' => $item->addon_group_id,
                    'prices' => $item->prices,
                    'created_at' => $item->created_at,
                    'updated_at' => $item->updated_at,
                ];
            }
            $addon_data  = $grouped;
        }
        else
        {
            $addon_data = [];
        }
        
        if(isset($request->counter))
        {
            $counter = $request->counter;
        }
        else
        {
            $counter = 0;
        }
        if($request->addon_id == 1 || $request->addon_id == 7)
        {
            return view('pos.addons_combo',array("addons"=>$addon_groups_sets,'item_id'=>$item_id,"addon_list"=>$addon_data,'rules_map'=>$addon_group_rules,'secondary'=>$secondary_item,'counter'=>$counter));
        }
        else
        {
            return view('pos.other_addons_combo',array("addons"=>$addon_groups_sets,'item_id'=>$item_id,"addon_list"=>$addon_data,'rules_map'=>$addon_group_rules,'secondary'=>$secondary_item,'counter'=>$counter));
        }
    }
    public function load_adons(Request $request)
    {
        $item_id = $request->item_id;
        $addon_group_rules = [];
        if(isset($request->addon_id))
        {
            
            $groups_array = DB::table("addon_groups")->where("addon_id",$request->addon_id)->get();
            foreach($groups_array as $group_map)
            {
                $addon_group_rules["$group_map->group_name"] = $group_map;
            }
            $addon_data = DB::table('addon_mappings')
            ->leftJoin('addon_groups', 'addon_groups.id', '=', 'addon_mappings.addon_group_id')
            ->select('addon_mappings.*', 'addon_groups.group_name')
            ->where('addon_mappings.addon_id', $request->addon_id)
            ->get();

            // Initialize grouped array
            $grouped = [];

            // Loop through each item and group by group_name
            foreach ($addon_data as $item) {
                $group = $item->group_name ?? 'Ungrouped'; // Fallback if group_name is null
                if (!isset($grouped[$group])) {
                    $grouped[$group] = [];
                }
                $grouped[$group][] = [
                    'id' => $item->id,
                    'item_id' => $item->item_id,
                    'addon_name' => $item->addon_name,
                    'addon_id' => $item->addon_id,
                    'addon_group_id' => $item->addon_group_id,
                    'prices' => $item->prices,
                    'created_at' => $item->created_at,
                    'updated_at' => $item->updated_at,
                ];
            }
            $addon_data  = $grouped;
            
        }
        else
        {
            $addon_data =  [];
        }
        $parent = $request->addon_parent;
        $addonGroupIds = DB::table('addon_mappings')
            ->where('item_id', $parent)
            ->distinct()
            ->pluck('addon_id');
        $addonGroups = DB::table('addons')
            ->whereIn('id', $addonGroupIds)
            ->get();
        if($request->addon_id == 1)
        {
            return view('pos.addons',array("addons"=>$addonGroups,"addon_list"=>$addon_data,'parent'=>$parent,'rules_map'=>$addon_group_rules,'item_id'=>$item_id));
        }
        else
        {
            return view('pos.other_addons',array("addons"=>$addonGroups,"addon_list"=>$addon_data,'parent'=>$parent,'rules_map'=>$addon_group_rules,'item_id'=>$item_id));
        }    
    }

    public function logout(Request $request) 
    {
        Auth::logout();
        return redirect()->route('pos.login');
    }

    public function switch_type(Request $request)
    {
        if($request->type == "Delivery")
        {
            session(['delivery' => 'yes']);
        }
        else
        {
            if ($request->session()->has('delivery')) 
            {
                $request->session()->forget('delivery');
            }


        }
    }

    public function checkout(Request $request)
    {
        $business_config = DB::table("settings")->first();
        $userId = Auth::id();

        // Get cart items for the user and join with items table, also get parent item name
        $cart = DB::table('cart')
            ->where('cart.user_id', $userId)
            ->join('items as i', 'cart.item_id', '=', 'i.id')
            ->leftJoin('items as p', 'i.parent_id', '=', 'p.id') // self join to get parent
            ->select(
                'cart.*',
                'i.item_name',
                'i.item_image',
                'i.item_price',
                'i.item_delivery_price',
                'p.item_name as parent_item_name' // parent item name
            )
            ->get();

        $cart_data = $cart->count() > 0 ? $cart : collect(); // empty collection if no items

        return view('pos.checkout', compact('cart_data','business_config'));
    }

    public function saveBill(Request $request)
    {
        $billData = json_decode($request->bill, true);

        if (!$billData) {
            return response()->json(['error' => 'Invalid bill data'], 400);
        }

        $userId = Auth::id();

        $id = DB::table('bills')->insertGetId([
            'user_id'          => $userId,
            'customer_name'    => $billData['customer']['name'] ?? null,
            'customer_phone'   => $billData['customer']['phone'] ?? null,
            'customer_address' => $billData['customer']['address'] ?? null,
            'delivery_time'    => $billData['delivery_time'] ?? null,
            'order_type'       => $billData['order_type'] ?? null,
            'cart'             => json_encode($billData['cart']),
            'subtotal'         => $billData['summary']['subtotal'] ?? 0,
            'tax_percentage'   => $billData['summary']['tax_percentage'] ?? 0,
            'tax_amount'       => $billData['summary']['tax_amount'] ?? 0,
            'grand_total'      => $billData['summary']['grand_total'] ?? 0,
            'payment_status'   => $billData['payment_status'] ?? 'Pending',
        ]);
        
        DB::table('cart')->where('cart.user_id', $userId)->delete();
        
        $bill = DB::table('bills')->where('id', $id)->first();

        return view('bill.print', compact('bill'));
    }
}
