<?php

namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Product;
use App\Models\Productimage;
use App\Models\Productprice;
use App\Models\Productcolor;
use App\Models\Productsize;
use App\Models\Category;
use App\Models\Subcategory;
use App\Models\Childcategory;
use App\Models\Brand;
use App\Models\Color;
use App\Models\Size;
use Toastr;
use File;
use Str;
use Image;
use DB;

class ProductController extends Controller
{
    public function getSubcategory(Request $request)
    {
        $subcategory = DB::table("subcategories")
        ->where("category_id", $request->category_id)
        ->pluck('subcategoryName', 'id');
        return response()->json($subcategory);
    }
    public function getChildcategory(Request $request)
    {
        $childcategory = DB::table("childcategories")
        ->where("subcategory_id", $request->subcategory_id)
        ->pluck('childcategoryName', 'id');
        return response()->json($childcategory);
    }
    
    
    function __construct()
    {
         $this->middleware('permission:product-list|product-create|product-edit|product-delete', ['only' => ['index','show']]);
         $this->middleware('permission:product-create', ['only' => ['create','store']]);
         $this->middleware('permission:product-edit', ['only' => ['edit','update']]);
         $this->middleware('permission:product-delete', ['only' => ['destroy']]);
    }
    
    
    public function index(Request $request)
    {
        if($request->keyword){
            $data = Product::orderBy('id','DESC')->where('name', 'LIKE', '%' . $request->keyword . "%")->with('image','category')->paginate(50);
        }else{
            $data = Product::orderBy('id','DESC')->with('image','category')->paginate(50);
        }
        return view('backEnd.product.index',compact('data'));
    }
    public function create()
    {
        $categories = Category::where('parent_id','=','0')->where('status',1)->select('id','name','status')->with('childrenCategories')->get();
        $brands = Brand::where('status','1')->select('id','name','status')->get();
        $colors = Color::where('status','1')->get();
        $sizes = Size::where('status','1')->get();
        return view('backEnd.product.create',compact('categories','brands','colors','sizes'));
    }
   /** public function store(Request $request)
    {
        $this->validate($request, [
            'name' => 'required',
            'category_id' => 'required',
            'new_price' => 'required',
            'purchase_price' => 'required',
            'stock' => 'required',
            'category_id' => 'required',
            'description' => 'required',
        ]);
        $last_id = Product::orderBy('id', 'desc')->select('id')->first();
        $last_id = $last_id?$last_id->id+1:1;
        $input = $request->except(['image','files','proSize','proColor']);

        $input['slug'] = strtolower(preg_replace('/[\/\s]+/', '-', $request->name.'-'.$last_id));

        $input['status'] = $request->status?1:0;
        $input['topsale'] = $request->topsale?1:0;
        $input['feature_product'] = $request->feature_product?1:0;
        $input['product_code'] = 'P' . str_pad($last_id, 4, '0', STR_PAD_LEFT);
        $save_data = Product::create($input);
        $save_data->sizes()->attach($request->proSize);
        $save_data->colors()->attach($request->proColor);
        
        // image with intervention 
        $images = $request->file('image');
        if($images){
            foreach ($images as $key => $image) {
                $name =  time().'-'.$image->getClientOriginalName();
                $name = strtolower(preg_replace('/\s+/', '-', $name));
            	$uploadPath = 'public/uploads/product/';
            	$image->move($uploadPath,$name);
            	$imageUrl =$uploadPath.$name;

                $pimage             = new Productimage();
                $pimage->product_id = $save_data->id;
                $pimage->image      = $imageUrl;
                $pimage->save();
            }
            
        }
        Toastr::success('Success','Data insert successfully');
        return redirect()->route('products.index');
    }**/
    public function store(Request $request)
{
    $this->validate($request, [
        'name' => 'required',
        'category_id' => 'required',
        'new_price' => 'required|numeric',
        'purchase_price' => 'required|numeric',
        'stock' => 'required|numeric',
        'description' => 'required',
        'offer_percentage' => 'nullable|numeric|min:0|max:100',
    ]);

    $last_id = Product::orderBy('id', 'desc')->select('id')->first();
    $last_id = $last_id ? $last_id->id + 1 : 1;

    $input = $request->except(['image','files','proSize','proColor']);

    $input['slug'] = strtolower(preg_replace('/[\/\s]+/', '-', $request->name.'-'.$last_id));

    $input['status'] = $request->status ? 1 : 0;
    $input['topsale'] = $request->topsale ? 1 : 0;
    $input['feature_product'] = $request->feature_product ? 1 : 0;
    $input['product_code'] = 'P' . str_pad($last_id, 4, '0', STR_PAD_LEFT);

    // Handle offer price adjustment
    $input['offer_status'] = $request->offer_status ? 1 : 0;
    $input['offer_percentage'] = $request->offer_percentage ?? 0;

    if($input['offer_status'] && $input['offer_percentage'] > 0) {
        // Apply discount to new_price
        $discount = ($input['new_price'] * $input['offer_percentage']) / 100;
        $input['new_price'] = round($input['new_price'] - $discount, 2);
    }

    $save_data = Product::create($input);

    // Attach sizes and colors
    if($request->proSize) {
        $save_data->sizes()->attach($request->proSize);
    }
    if($request->proColor) {
        $save_data->colors()->attach($request->proColor);
    }

    // Save images
    $images = $request->file('image');
    if($images){
        foreach ($images as $key => $image) {
            $name = time() . '-' . $image->getClientOriginalName();
            $name = strtolower(preg_replace('/\s+/', '-', $name));
            $uploadPath = 'public/uploads/product/';
            $image->move($uploadPath, $name);
            $imageUrl = $uploadPath . $name;

            $pimage = new Productimage();
            $pimage->product_id = $save_data->id;
            $pimage->image = $imageUrl;
            $pimage->save();
        }
    }

    Toastr::success('Success','Data inserted successfully');
    return redirect()->route('products.index');
}

    
    public function edit($id)
    {
        $edit_data = Product::with('images')->find($id);
        $categories = Category::where('parent_id','=','0')->where('status',1)->select('id','name','status')->get();
        $categoryId = Product::find($id)->category_id;
        $subcategoryId = Product::find($id)->subcategory_id;
        $subcategory = Subcategory::where('category_id', '=', $categoryId)->select('id','subcategoryName','status')->get();
        $childcategory = Childcategory::where('subcategory_id', '=', $subcategoryId)->select('id', 'childcategoryName', 'status')->get();
        $brands = Brand::where('status','1')->select('id','name','status')->get();
        $totalsizes = Size::where('status',1)->get();
        $totalcolors = Color::where('status',1)->get();
        $selectcolors = Productcolor::where('product_id',$id)->get();
        $selectsizes = Productsize::where('product_id',$id)->get();
        return view('backEnd.product.edit',compact('edit_data','categories', 'subcategory', 'childcategory', 'brands', 'selectcolors', 'selectsizes','totalsizes', 'totalcolors'));
    }
    public function price_edit()
    {
        $products = DB::table('products')->select('id','name','status','old_price','new_price','stock')->where('status',1)->get();;
        return view('backEnd.product.price_edit',compact('products'));
    }
    /**public function price_update(Request $request)
{
    $ids = $request->ids;
    $oldPrices = $request->old_price;
    $newPrices = $request->new_price;
    $stocks = $request->stock;
    foreach ($ids as $key => $id) {
        $product = Product::select('id','name','status','old_price','new_price','stock')->find($id);

        if ($product) {
            $product->update([
                'old_price' => $oldPrices[$key],
                'new_price' => $newPrices[$key],
                'stock' => $stocks[$key],
            ]);
        }
    }
    Toastr::success('Success','Price update successfully');
    return redirect()->back();
}**/
public function price_update(Request $request)
{
    $ids = $request->ids;
    $oldPrices = $request->old_price;
    $newPrices = $request->new_price;
    $stocks = $request->stock;

    foreach ($ids as $key => $id) {
        $product = Product::select('id','name','status','old_price','new_price','stock','offer_status','offer_percentage')->find($id);

        if ($product) {
            $updatedPrice = $newPrices[$key];

            // Apply offer if active
            if($product->offer_status && $product->offer_percentage > 0) {
                $discount = ($updatedPrice * $product->offer_percentage) / 100;
                $updatedPrice = round($updatedPrice - $discount, 2);
            }

            $product->update([
                'old_price' => $oldPrices[$key],
                'new_price' => $updatedPrice,
                'stock' => $stocks[$key],
            ]);
        }
    }

    Toastr::success('Success','Price update successfully');
    return redirect()->back();
}

    
    public function update(Request $request)
{
    $this->validate($request, [
        'name' => 'required',
        'category_id' => 'required',
        'new_price' => 'required',
        'purchase_price' => 'required',
        'stock' => 'required',
        'description' => 'required',
    ]);

    $update_data = Product::find($request->id);
    $input = $request->except(['image','files','proSize','proColor']);

    $last_id = Product::orderBy('id', 'desc')->select('id')->first();
    $input['slug'] = strtolower(preg_replace('/[\/\s]+/', '-', $request->name.'-'.$last_id->id));

    $input['status'] = $request->status ? 1 : 0;
    $input['topsale'] = $request->topsale ? 1 : 0;
    $input['feature_product'] = $request->feature_product ? 1 : 0;

    // Handle offer
    $input['offer_status'] = $request->offer_status ? 1 : 0;
    $input['offer_percentage'] = $request->offer_status ? $request->offer_percentage : null;

    // Calculate new_price based on offer if applicable
    $newPrice = $request->new_price;
    if ($input['offer_status'] && $input['offer_percentage'] > 0) {
        $discount = ($newPrice * $input['offer_percentage']) / 100;
        $newPrice = round($newPrice - $discount, 2);
    }
    $input['new_price'] = $newPrice;

    $update_data->update($input);

    // Sync sizes and colors
    $update_data->sizes()->sync($request->proSize);
    $update_data->colors()->sync($request->proColor);

    // Handle images
    $images = $request->file('image');
    if ($images) {
        foreach ($images as $image) {
            $name = time() . '-' . $image->getClientOriginalName();
            $name = strtolower(preg_replace('/\s+/', '-', $name));
            $uploadPath = 'public/uploads/product/';
            $image->move($uploadPath, $name);
            $imageUrl = $uploadPath . $name;

            $pimage = new Productimage();
            $pimage->product_id = $update_data->id;
            $pimage->image = $imageUrl;
            $pimage->save();
        }
    }

    Toastr::success('Success', 'Data updated successfully');
    return redirect()->route('products.index');
}

    public function inactive(Request $request)
    {
        $inactive = Product::find($request->hidden_id);
        $inactive->status = 0;
        $inactive->save();
        Toastr::success('Success','Data inactive successfully');
        return redirect()->back();
    }
    public function active(Request $request)
    {
        $active = Product::find($request->hidden_id);
        $active->status = 1;
        $active->save();
        Toastr::success('Success','Data active successfully');
        return redirect()->back();
    }
    public function destroy(Request $request)
    {
        $delete_data = Product::find($request->hidden_id);
        $delete_data->delete();
        Toastr::success('Success','Data delete successfully');
        return redirect()->back();
    }
    public function imgdestroy(Request $request)
    { 
        $delete_data = Productimage::find($request->id);
        File::delete($delete_data->image);
        $delete_data->delete();
        Toastr::success('Success','Data delete successfully');
        return redirect()->back();
    } 
    public function pricedestroy(Request $request)
    { 
        $delete_data = Productprice::find($request->id);
        $delete_data->delete();
        Toastr::success('Success','Product price delete successfully');
        return redirect()->back();
    }
    public function update_deals(Request $request){
        $products = Product::whereIn('id', $request->input('product_ids'))->update(['topsale' => $request->status]);
        return response()->json(['status'=>'success','message'=>'Hot deals product status change']);
    }
    public function update_feature(Request $request){
        $products = Product::whereIn('id', $request->input('product_ids'))->update(['feature_product' => $request->status]);
        return response()->json(['status'=>'success','message'=>'Feature product status change']);
    }
    public function update_status(Request $request){
        $products = Product::whereIn('id', $request->input('product_ids'))->update(['status' => $request->status]);
        return response()->json(['status'=>'success','message'=>'Product status change successfully']);
    }
    public function offer(){
         // Get all products with offer_status = 1 and offer_percentage > 0
    $offeredProducts = Product::where('status', 1)
                              ->where('offer_status', 1)
                              ->where('offer_percentage', '>', 0)
                              ->with('images') // eager load images
                              ->get();
    return view('frontEnd.layouts.pages.offer', compact('offeredProducts'));
    }
}
