<?php

namespace App\Http\Controllers\Admin\Payment;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Payment;
use App\Models\payment_gateway;
use App\Models\Order;
use Illuminate\Support\Carbon;
// use App\Exports\PaymentOrderExport;
// use Maatwebsite\Excel\Facades\Excel;
// use Illuminate\Support\Facades\Storage;
// use Maatwebsite\Excel\Excel as ExcelExcel;

class PaymentController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */

     public function __construct()
     {
         $this->middleware('auth:admin');
     }
     public function index(Request $request)
    {
        abort_if(!userCan('payment.view'), 403);
        $query = Payment::query();
       
     

        $query->searchQuery($query);
        
        if (request()->has('candidate_id') && request('candidate_id') != null) {
            $query->where('candidate_id', request('candidate_id'));
        }

        if ($request->has('status') && $request->status != null) {
            $query->where('payment_status', $request->status);
        }

        
        
        $datetimeD = $request->input('created_at');
        if ($datetimeD) {
            $dates = explode(' - ', $datetimeD);
            $startDate = Carbon::createFromFormat('m/d/Y', $dates[0])->startOfDay()->format('Y-m-d H:i:s');
            $endDate = Carbon::createFromFormat('m/d/Y', $dates[1])->endOfDay()->format('Y-m-d H:i:s');
    
            $query->whereBetween('created_at', [$startDate, $endDate]);
        }

        $allPayments =  $query->count();

        // $payments = $query->orderBy('created_at', 'desc')->paginate(10)->withQueryString();  
        $elementsPerPage = $request->input('perPage', 10); 
        if($elementsPerPage == "All"){
            $payments = $query->orderBy('created_at', 'desc')->get();  
        }else{
            $payments = $query->orderBy('created_at', 'desc')->paginate($elementsPerPage)->withQueryString();  
        }

        $paymentGateways = payment_gateway::all(['id', 'name']);

        return view('admin.payment.index', compact('payments','allPayments','paymentGateways'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {

       abort_if(!userCan('payment.create'), 403);
      
               $request->validate([
                  
                   'order_id' => 'required',
                   'transaction_id' => 'required|unique:payments,transaction_id',
                   'payment_gateway_id' => 'required',
                   'payment_status' => 'required',
                   'payment_mode' => 'required',
                   'invoice_number' => 'required',
                   'amount' => 'required|numeric',
                   'datetime' => 'required',
               ]);
       
               $candidate_id = null;

               if (!empty($request->order_id)) {
                   $candidate_id = Order::where('id', $request->order_id)->value('candidate_id');
               }

            
       
               Payment::create([
                   'order_id' => $request->order_id,
                   'transaction_id' => $request->transaction_id,
                   'payment_gateway_id' => $request->payment_gateway_id,
                   'payment_status' => $request->payment_status,
                   'payment_mode' => $request->payment_mode,
                   'invoice_number' => $request->invoice_number,
                   'currency_symbol' => $request->currency_symbol,
                   'amount' => number_format($request->amount, 2, '.', ''),
                   'candidate_id' => $candidate_id,
                   'created_by' => Auth()->user()->id,
                   'created_at' =>  Carbon::parse($request->datetime)->format('Y-m-d H:i:s'),
               ]);

               flashSuccess("Payment Created Successfully");
                if ($request->ajax()) {
                    return response()->json(['success' => true, 'message' => 'Payment Created Successfully']);
                }

               return redirect()->route('admin.payment.index');
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
  
    public function destroy($id)
    {
        abort_if(!userCan('payment.delete'), 403);
        $address = Payment::find($id);
        $address->delete();

        flashSuccess("Payment Deleted Successfully!");
        return back();
    }
    public function oderIdUpdatePaymentStatus(Request $request, $id)
    {
        @$roleNames = Auth()->user()->getRoleNames()->toArray();
        @$leadManagerEnvRole = ['superadmin'];
      
        if (Auth()->user()->id && array_intersect($leadManagerEnvRole, $roleNames)) {
            $payments = Payment::where('order_id', $id)->get();
      
            foreach ($payments as $payment) {
                if ($payment->payment_status == "unpaid") {
                   
                    $payment->update(['payment_status' => 'paid']);
                }
            }

            $order = Order::where('id', $id)->first();
            $order->status = 'paid';
            $order->update();
            return "done";
        }else{
            return 404;
        }
      
    }

  
    // public function export(Request $request)
    // {

    //     $query = Payment::query();// Replace YourModel with your actual model




    //     $query->searchQuery($query);
        
    //     if (request()->has('candidate_id') && request('candidate_id') != null) {
    //         $query->where('candidate_id', request('candidate_id'));
    //     }

    //     if ($request->has('status') && $request->status != null) {
    //         $query->where('payment_status', $request->status);
    //     }

        
        
    //     $datetimeD = $request->input('created_at');
    //     if ($datetimeD) {
    //         $dates = explode(' - ', $datetimeD);
    //         $startDate = Carbon::createFromFormat('m/d/Y', $dates[0])->startOfDay()->format('Y-m-d H:i:s');
    //         $endDate = Carbon::createFromFormat('m/d/Y', $dates[1])->endOfDay()->format('Y-m-d H:i:s');
    
    //         $query->whereBetween('created_at', [$startDate, $endDate]);
    //     }

    //     $data = $query->orderBy('created_at', 'desc')->get();  

    //         if ($data->isEmpty()) {
    //             return response()->json([
    //                 'message' => 'No data found',
    //             ], 200);
    //         }
            
    //         $fileName = 'paymentOrder.xlsx';
    //         $filePath = 'export/' . $fileName;
    
    //         $export = new PaymentOrderExport($data);
    
    //         // Store the file first
    //         Excel::store($export, $filePath, 'public');
    
    //         // Check if the file exists
    //         if (Storage::exists($filePath)) {
    //             // Delete the file if it exists
    //             Storage::delete($filePath);
    //         }
    
    //         $message = "Export Successfully!";
    
    //         return response()->json([
    //             'message' => $message,
    //             'url' => asset('download?url=export/' . $fileName),
    //         ]);
        
   
      
    // }


 

    public function export(Request $request)
    {
        abort_if(!userCan('payment.export'), 403);

        $query = Payment::query();
       
        $query->searchQuery($query);
        
        if (request()->has('candidate_id') && request('candidate_id') != null) {
            $query->where('candidate_id', request('candidate_id'));
        }

        if ($request->has('status') && $request->status != null) {
            $query->where('payment_status', $request->status);
        }

        
        
        $datetimeD = $request->input('created_at');
        if ($datetimeD) {
            $dates = explode(' - ', $datetimeD);
            $startDate = Carbon::createFromFormat('m/d/Y', $dates[0])->startOfDay()->format('Y-m-d H:i:s');
            $endDate = Carbon::createFromFormat('m/d/Y', $dates[1])->endOfDay()->format('Y-m-d H:i:s');
    
            $query->whereBetween('created_at', [$startDate, $endDate]);
        }

        $query->with(['order.plan' => function ($query) {
            $query->select('id', 'title')->withTrashed();
        }])
        ->with(['payment_gateway' => function ($query) {
            $query->select('id', 'name');
        }]);

        $data = $query->get();
        
        $fileName = 'exported_data.csv';
    
        // Output CSV headers
        header('Content-Type: text/csv');
        header('Content-Disposition: attachment; filename=' . $fileName);
    
        // Open the output stream
        $output = fopen('php://output', 'w');
    
        // Write CSV headers
        fputcsv($output, [
            'Id',
            'OrderID',
            'Transaction ID',
            'Package Name',
            'Candidate Name',
            'Amount',
            'Status',
            'Payment Gateway',
            'Payment Mode',
            'Invoice Number',
            'Date',
        ]);
    
        // Write the data to the CSV file
        foreach ($data as $row) {
           
            fputcsv($output, [
                $row->id,
                $row->order_id,
                $row->transaction_id,
                $row->order->plan->title ?? "--",
                $row->candidate->user->name ?? "--",
                $row->amount,
                $row->payment_status,
                $row->payment_gateway->name ?? $row->payment_gateway_id,
                $row->payment_mode ?? "--",
                $row->invoice_number ?? "--",
                $row->created_at ?? "--",
            ]);
        }
    
        // Close the output stream
        fclose($output);
    
        exit;
    }
    
    
}
