<?php

namespace App\Http\Controllers\Admin;

use App\Models\IamPrincipal;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Facades\Excel;
use App\Models\OrderedPassport;
use App\Exports\customer_export;
use App\Exports\customer_export_selected;
use App\Exports\CustomerExportSelected;
use App\Models\ManageRestaurant;
use App\Models\ManageState;
use App\Models\RedeemRestaurant;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Barryvdh\DomPDF\PDF as DomPDFPDF;
use Carbon\Carbon;
use Exception;
use PDF;




class ManageCustomerController extends Controller
{

    /*
          Created By : Sayali Parab
          Created at : 28 May 2024
          Use : To Get User Page.
        */
    public function index()
    {
        try {
            // Eager load the state relationship for all customers
            $customers = IamPrincipal::where('principal_type_xid', 3)
                ->with('state')
                ->orderBy('created_at', 'desc')
                ->get();

            return view('Admin.pages.manage_users.manage_customer.customer', compact('customers'));
        } catch (Exception $e) {
            Log::error("Manage Voucher Page Not Load " . $e->getMessage());
            return jsonResponseWithErrorMessage(__('auth.something_went_wrong'), 500);
        }
    }
    /*
        Created By : Sayali Parab
        Created at : 28 May 2024
        Use : To Get Passport Page.
        */
    public function view_customer($id)
    {


        try {
            $customers_data = IamPrincipal::with('state','contactMessages')->findOrFail($id);
            if ($customers_data->contactMessages->isEmpty()) {
                Log::info('No contact messages found for customer with ID: ' . $id);
            }
            // return  $customers_data;
            return view('Admin.pages.manage_users.manage_customer.view_customer_details', compact('customers_data'));
        } catch (Exception $e) {
            Log::error("Manage Voucher Page Not Load " . $e->getMessage());
            return jsonResponseWithErrorMessage(__('auth.something_went_wrong'), 500);
        }
    }
    /*
        Created By : Sayali Parab
        Created at : 28 May 2024
        Use : To Get Customer data.
        */

    public function edit_customer($id)
    {

        try {
            $customers_data = IamPrincipal::with('state')->findOrFail($id);
            $state = ManageState::where('is_active', 1)->get();
            return view('Admin.pages.manage_users.manage_customer.edit_customer', compact('customers_data', 'state'));
        } catch (Exception $e) {
            Log::error("Manage Voucher Page Not Load " . $e->getMessage());
            return jsonResponseWithErrorMessage(__('auth.something_went_wrong'), 500);
        }
    }
    /*
        Created By : Sayali Parab
        Created at : 28 May 2024
        Use : To Update Customer Form.
        */

    public function update(Request $request)
    {
        // Validation rules
        $rules = [
            'email_address' => [
                'required',
                'string',
                'email',
                'max:100',
                Rule::unique('iam_principal')->where(function ($query) use ($request) {
                    return $query->where('principal_type_xid', 3)
                        ->whereNull('deleted_at')
                        ->where('id', '!=', $request->customer_id);
                }),
            ],
            'date_of_birth' => [
                'required',
                'date',
                function ($attribute, $value, $fail) {
                    $dob = Carbon::parse($value);
                    $age = $dob->age;
                    if ($age < 21) {
                        $fail('You must be at least 21 years old.');
                    }
                },
            ],
        ];

        $messages = [
            'email_address.required' => 'Enter email address',
            'email_address.email' => 'Please enter a valid email address',
            'email_address.unique' => 'This email is already registered',
            'date_of_birth.required' => 'Date of Birth is required',
            'date_of_birth.date' => 'Please enter a valid date',
        ];

        $validator = Validator::make($request->all(), $rules, $messages);

        if ($validator->fails()) {
            return response()->json(['errors' => $validator->errors()], 422);
        }

        try {
            DB::beginTransaction();

            $customer_data = IamPrincipal::where('id', $request->customer_id)->first();
            $customer_data->first_name = $request->input('name');
            $customer_data->last_name = $request->input('last_name');
            $customer_data->phone_number = $request->input('phone');
            $customer_data->email_address = $request->input('email_address');
            $customer_data->date_of_birth = $request->input('date_of_birth');
            $customer_data->state_xid = $request->input('state_xid');
            $customer_data->save();

            DB::commit();

            return jsonResponseWithSuccessMessage(__('success.update_data'));
        } catch (Exception $e) {
            DB::rollBack();
            Log::error("updateCustomerNewsArticle Services Page Load Failed " . $e->getMessage());
            return jsonResponseWithErrorMessage(__('auth.something_went_wrong'), 500);
        }
    }

    public function archive_customer()
    {
        /*
        Created By : Sayali Parab
        Created at : 28 May 2024
        Use : To Get archieve customer.
        */
        try {
            $customers = IamPrincipal::where('principal_type_xid', 3)->onlyTrashed()->latest()->get();
            return view('Admin.pages.manage_users.manage_customer.archive_manage_customer', compact('customers'));
        } catch (Exception $e) {
            Log::error("Manage Voucher Page Not Load " . $e->getMessage());
            return jsonResponseWithErrorMessage(__('auth.something_went_wrong'), 500);
        }
    }

    /*
    Created By : Sayali Parab
    Created at : 28 May 2024
    Use : To Get delete customer.
    */
    public function delete_customer($id)
    {

        try {
            DB::beginTransaction();

            $passport = IamPrincipal::find($id);
            $passport->one_signal_player_id = null;
            $passport->deleted_by_admin = 1;
            $passport->save();

            $passport->delete();
            // dd($passport);
            DB::commit();

            return response()->json(['success' => true, 'status' => 200]);
        } catch (Exception $e) {
            DB::rollBack();
            Log::error("delete_passport function Load Failed " . $e->getMessage());
            return response()->json(['success' => false, 'status' => 500, 'message' => __('auth.something_went_wrong')]);
        }
    }
    /*
        Created By : Sayali Parab
        Created at : 28 May 2024
        Use : To Get pdf.
        */
    public function download_pdf($id)
    {
        try {
            $customers_data = IamPrincipal::findOrFail($id);
            $data = [
                'customers_data' => $customers_data
            ];

            $pdf = PDF::loadView('Admin.pages.manage_users.manage_customer.view_customer_details_pdf', $data);
            return $pdf->download('customer_details.pdf');
        } catch (Exception $e) {
            Log::error("Error generating PDF: " . $e->getMessage());
            return response()->json(['error' => __('auth.something_went_wrong')], 500);
        }
    }

 /*
        Created By : Sayali Parab
        Created at : 28 May 2024
        Use : To Get Excel.
        */
    
    public function exportSelectedCustomer(Request $request)
    {
        try {
            if ($request->has('all_id')) {
                return Excel::download(new customer_export, 'Passport_data.xlsx');
            }
            
            $ids = $request->selected_id;
            
            if (empty($ids)) {
                return response()->json(['error' => 'No IDs provided for export.'], 400);
            }
    
            Log::info("Selected IDs for export: " . $ids);
    
            $fileName = 'selected_customer_data.xlsx';
    
            Log::info("Attempting to export selected customers to file: " . $fileName);
    
            return Excel::download(new customer_export_selected($ids), $fileName);
        } catch (\Exception $e) {
            Log::error('Export failed: ' . $e->getMessage());
            return response()->json(['error' => 'Export failed. Something went wrong.'], 500);
        }
    }
    


   


            /*
              Created By : Sayali Parab
              Created at : 28 May 2024
              Use : To Deleted Data Restore.
            */
    public function unarchive_customer($id)
    {

        try {
            DB::beginTransaction();
            IamPrincipal::withTrashed()->where('id', $id)->restore();

            DB::commit();

            return response()->json(['success' => true, 'status' => 200]);
        } catch (Exception $e) {
            DB::rollBack();
            Log::error("delete_passport function Load Failed " . $e->getMessage());
            return response()->json(['success' => false, 'status' => 500, 'message' => __('auth.something_went_wrong')]);
        }
    }

    /*
    Created By : Sayli Raut
    Created at : 05 June 2024
    Use : To get customer redeem restaurant details.
    */

    public function manageCustomerRestaurants(Request $request, $id)
    {
        try {
            $redeemDetails = RedeemRestaurant::with('restaurant', 'customer')->where('iam_principal_xid', $id)->get();
            return view('Admin.pages.manage_users.manage_customer.customer_restaurants', compact('redeemDetails'));
        } catch (Exception $e) {
            Log::error("Error getting restaurant details: " . $e->getMessage());
            return response()->json(['error' => __('auth.something_went_wrong')], 500);
        }
    }
}
