<?php

namespace App\Http\Controllers;

use App\Mail\Testing;
use App\Models\User;

use Illuminate\Support\Facades\DB;

use App\Models\Cart;
use App\Models\Products;
use App\Models\Order;
use App\Models\OrderItem;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;


class MainController extends Controller
{
    public function index()
    {
        if (session()->get('type') == 'Customer') {
            $allProducts = Products::all();
            //dd($allProducts);
            $newArrival = Products::where('type', 'new-arrival')->get();
            $hotSale = Products::where('type', 'sale')->get();


            return view('index', compact('allProducts', 'hotSale', 'newArrival'));
        }
        return redirect()->back();
    }

    public function about()
    {
        return view('about');
    }

    public function register()
    {
        return view('register');
    }



    public function registerUser(Request $data)
    {

        //   dd($data->all());
        // Validate the input data
        $data->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:8|confirmed',
            'file' => 'required|file|mimes:jpg,png,jpeg|max:2048',
        ]);

        // Create a new user
        try {
            $newUser = new User();
            $newUser->name = $data->input('name');
            $newUser->email = $data->input('email');
            $newUser->password = Hash::make($data->input('password'));  // Hashing the password
            $newUser->picture = $data->file('file')->getClientOriginalName();
            $data->file('file')->move('uploads/profiles/', $newUser->picture);
            $newUser->type = "Customer";

            if ($newUser->save()) {
                return redirect('login')->with('success', 'Account created successfully!');
            }

            return redirect('register')->with('error', 'Account creation failed. Please try again.');
        } catch (\Exception $e) {
            return redirect('register')->with('error', 'An error occurred: ' . $e->getMessage());
        }
    }





    public function login()
    {
        return view('login');
    }

    // public function loginUser(Request $data)
    // {
    //     $user = User::where('email', $data->input('email'))->first();
    //     if ($user && Hash::check($data->input('password'), $user->password)) {  // Verifying the hashed password
    //         session()->put('id', $user->id);
    //         session()->put('type', $user->type);
    //         if ($user->type == 'Customer') {
    //             return redirect('/');
    //         }else if($user->type == 'Admin'){
    // return redirect('/admin)}
    //     } else {
    //         return redirect('login')->with('error', 'Invalid email or password!');
    //     }
    // }


    //old loginUser
    // public function loginUser(Request $data)
    // {
    //     $user = User::where('email', $data->input('email'))->first();

    //     //if ($user && Hash::check($data->input('password'), $user->password)) {
    //     if ($user && Hash::check($data->input('password'), $user->password) && $user->status == 'Active') {
    //         session()->put('id', $user->id);
    //         session()->put('type', $user->type);

    //         if ($user->type == 'Customer') {
    //             return redirect('/');
    //         } else if ($user->type == 'Admin') {
    //             return redirect('/admin');
    //         }
    //     }

    //     return redirect('login')->with('error', 'Invalid email or password!');
    // }

    //new loginUser
    public function loginUser(Request $data)
    {
        $user = User::where('email', $data->input('email'))->first();

        if ($user && Hash::check($data->input('password'), $user->password)) {
            if ($user->status == 'Active') {
                session()->put('id', $user->id);
                session()->put('type', $user->type);

                if ($user->type == 'Customer') {
                    return redirect('/');
                } elseif ($user->type == 'Admin') {
                    return redirect('/admin');
                }
            } elseif ($user->status == 'Blocked') {
                return redirect('login')->with('error', 'Your account is blocked. Please contact support.');
            }
        }

        return redirect('login')->with('error', 'Invalid email or password!');
    }


    public function logout()
    {
        session()->forget('id');
        session()->forget('type');
        return redirect('/login');
    }

    public function singleProduct($id)
    {
        $products = Products::find($id);

        if (!$products) {
            abort(404);
        }

        return view('singleProduct', compact('products'));
    }


    public function blogDetails()
    {
        return view('blogDetails');
    }

    // public function cart()
    // {
    //     $cartItems = DB::table('products')
    //         ->join('carts', 'carts.productsId', 'product.id')
    //         ->select('products.name', 'products.price', 'products.picture', 'products.quantity as pQuantity', 'carts.*')
    //         ->where('carts.customerId', session()->get('id'))
    //         ->get();

    //     dd($cartItems);

    //     return view('cart', compact('cartItems'));
    // }

    public function cart()
    {
        if (session()->get('type') == 'Customer') {
            $cartItems = DB::table('products')
                // ->join('carts', 'carts.productId', '=', 'products.id')
                ->join('carts', 'carts.productId', 'products.id')
                ->select('products.name', 'products.price', 'products.picture', 'products.quantity as pQuantity', 'carts.*')
                ->where('carts.customerId', session()->get('id'))
                ->get();

            //dd($cartItems);

            return view('cart', compact('cartItems'));
        }
        return redirect()->back();
    }

    public function addToCart(Request $data)
    {
        if (session()->has('id')) {
            $item = new Cart();
            $item->quantity = $data->input('quantity');
            $item->productId = $data->input('id');
            $item->customerId = session()->get('id');

            $item->save();
            return redirect()->back()->with('success', 'Item added to cart successfully!');
        } else {
            return redirect('/login')->with('error', 'Please login to add item to cart!');
        }
    }

    public function deleteCartItem($id)
    {
        $item = Cart::find($id);
        $item->delete();
        return redirect()->back()->with('success', 'Item deleted from cart successfully!');
    }


    public function updateCartItem(Request $data, $id)
    {
        // dd($request->all());
        if (session()->has('id')) {
            $item = Cart::find($id);
            if ($item) {
                $item->quantity = $data->input('quantity');
                $item->save();
                return redirect()->back()->with('success', 'Item updated successfully!');
            } else {
                return redirect()->back()->with('error', 'Item not found!');
            }
        } else {
            return redirect('/login')->with('error', 'Please login to update item!');
        }
    }



    //old myOrders
    // public function myOrders()
    // {
    //     if (session()->has('id')) {
    //         $orders = Order::where('customerId', session()->get('id'))->get();

    //         $items = DB::table('products')
    //             ->join('order_items', 'order_items.productId', '=', 'products.id')
    //             ->select('products.name', 'products.picture', 'products.*', 'order_items.orderId')
    //             ->get();

    //         return view('orders', compact('orders', 'items'));
    //     }

    //     return view('login');
    // }

    //new myOrders
    public function myOrders()
    {
        if (session()->get('type') == 'Customer') {
            if (session()->has('id')) {
                $orders = Order::where('customerId', session()->get('id'))->get();

                $items = DB::table('products')
                    ->join('order_items', 'order_items.productId', '=', 'products.id')
                    ->select('products.name', 'products.picture', 'order_items.*')

                    ->get();

                return view('orders', compact('orders', 'items'));
            }

            return view('login');
        }
        return redirect()->back();
    }




    public function profile()
    {
        if (session()->get('type') == 'Customer') {
            if (session()->has('id')) {
                $user = User::find(session()->get('id'));
                return view('profile', compact('user'));
            }
            return redirect('login');
        }
        return redirect()->back();
    }

    public function updateUser(Request $data)
    {
        $user = User::find(session()->get('id'));
        $user->name = $data->input('name');
        $user->email = $data->input('email');
        $user->password = $data->input('password');

        if ($data->file('file') != null) {
            $user->picture = $data->file('file')->getClientOriginalName();
            $data->file('file')->move('uploads/profiles/', $user->picture);
        }
        if ($user->save()) {
            return redirect()->back()->with('success', 'User updated successfully!');
        }
    }


    public function checkout(Request $data)
    {
        if (session()->has('id')) {
            $order = new Order();
            $order->status = "Pending";
            $order->customerId = session()->get('id');
            $order->name = $data->input('name');
            $order->phone = $data->input('phone');
            $order->address = $data->input('address');
            $order->bill = $data->input('bill');
            if ($order->save()) {
                $cartItems = Cart::where('customerId', session()->get('id'))->get();
                foreach ($cartItems as $item) {
                    $product = Products::find($item->productId);
                    $orderItem = new OrderItem();
                    $orderItem->orderId = $order->id;
                    $orderItem->productId = $item->productId;
                    $orderItem->quantity = $item->quantity;
                    $orderItem->price = $product->price;

                    $orderItem->save();
                    $item->delete();
                }
                return redirect()->back()->with('success', 'Order placed successfully!');
            } else {
                return redirect('login')->back()->with('error', 'Order not placed!');
            }
        }


        return view('checkout');
    }

    public function testMail()
    {
        if (session()->get('type') == 'Customer') {
            $details = [
                'title' => 'Mail from Uron Shrestha',
                'message' => 'This is for testing mail using smtp in Laravel!'
            ];
            Mail::to("yuron.stha57@gmail.com")->send(new Testing($details));
            return redirect('/');
        }
        return redirect()->back();
    }


    public function shop()
    {
        if (session()->get('type') == 'Customer') {
            return view('shop');
        }
        return redirect()->back();
    }
}