<?php

namespace App\Http\Controllers;

use App\Mail\VisitorWelcomeMail;
use App\Models\Visitor;
use App\Models\Member;
use App\Models\MeetingSchedule;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Log;

class VisitorController extends Controller
{
    public function index(Request $request)
    {
        $title = 'Visitor Master';
        $search = $request->input('search');

        $visitors = Visitor::when($search, function ($query, $search) {
            return $query->where('visitors.name', 'like', "%{$search}%")
                ->orWhere('visitors.email', 'like', "%{$search}%")
                ->orWhere('visitors.company', 'like', "%{$search}%")
                ->orWhere('visitors.phone', 'like', "%{$search}%");
        })
            ->leftJoin('members', 'visitors.referred_by_member_id', '=', 'members.id')
            ->select('visitors.*', 'members.name as referred_by_name', 'members.id as referred_by_id')
            ->orderby('visitors.id', 'desc')
            ->paginate(10);

        $members = Member::all();

        $totalVisitors = Visitor::count();
        $paidByMember = Visitor::where('paid_by', 'member')->count();
        $paidByVisitor = Visitor::where('paid_by', 'visitor')->count();
        $totalPaidAmount = Visitor::sum('amount');

        return view('visitors.index', compact('title', 'visitors', 'search', 'members', 'totalVisitors', 'paidByMember', 'paidByVisitor', 'totalPaidAmount'));
    }

    public function store(Request $request)
    {
        // dd($request->all()); exit;
        $validated = $request->validate([
            'name' => ['required', 'string', 'max:255'],
            'email' => ['nullable', 'email', 'max:255'],
            'phone' => ['nullable', 'string', 'max:20'],
            'company' => ['nullable', 'string', 'max:255'],
            'visit_date' => ['required', 'date'],
            'referred_by' => ['nullable', 'integer', Rule::exists('members', 'id')],
            'paid_by' => ['required', Rule::in(['visitor', 'member'])],
            'paid_amount' => ['nullable', 'numeric', 'min:0'],
            'payment_mode' => ['nullable', Rule::in(['cash', 'card', 'upi', 'ytc'])],
            'upi_number' => ['nullable', 'string', 'max:255'],
            'upi_transaction_id' => ['nullable', 'string', 'max:255'],
            'status' => ['nullable', Rule::in(['pending', 'paid', 'failed'])],
            'paid_to' => ['nullable', 'integer', Rule::exists('members', 'id')],
            'meeting_id' => ['nullable', 'integer'],
        ]);

        // dd($request->email); exit;


        $visitor = Visitor::create([
            'name' => $validated['name'],
            'company' => $validated['company'] ?? null,
            'phone' => $validated['phone'] ?? null,
            'email' => $validated['email'] ?? null,
            'referred_by_member_id' => $validated['referred_by'] ?? null,
            'paid_by' => $validated['paid_by'],
            'amount' => $validated['paid_amount'] ?? 1500,
            'payment_date' => $validated['visit_date'],
            'payment_mode' => $validated['payment_mode'] ?? null,
            'upi_number' => $validated['upi_number'] ?? null,
            'upi_transaction_id' => $validated['upi_transaction_id'] ?? null,
            'paid_to' => $validated['paid_to'] ?? null,
            'meeting_id' => $validated['meeting_id'] ?? null,
            'status' => $validated['payment_mode'] === 'ytc' ? 'pending' : 'paid',
        ]);

        // Send Email to Visitor
        if (!empty($visitor->email)) {
            // Mail::to('sabarikenathan@gmail.com')->queue(new VisitorWelcomeMail($visitor));
            // Mail::to('sabarikenathan@gmail.com')->send(new VisitorWelcomeMail($visitor));

            try {
                // Mail::to($member->email)->send(new PaymentSuccessMail($member, $payment));
                Mail::to($visitor->email)->send(new VisitorWelcomeMail(($visitor)));
            } catch (\Exception $e) {
                \Log::error('Visitor email failed: ' . $e->getMessage());
            }
        }

        if ($request->expectsJson()) {
            return response()->json([
                'success' => true,
                'message' => 'Visitor created successfully.',
                'data' => [
                    'visitor' => $visitor,
                ],
            ]);
        }

        return redirect()->route('visitors')->with('success', 'Visitor created successfully.');
    }

    // public function update(Request $request)
    // {
    //     $validated = $request->validate([
    //         'payment_mode' => ['required', Rule::in(['cash', 'card', 'upi'])],
    //         'upi_number' => ['nullable', 'string', 'max:255'],
    //         'upi_transaction_id' => ['nullable', 'string', 'max:255'],
    //     ]);


    //     // Ensure UPI details are provided if payment mode is UPI
    //     if ($validated['payment_mode'] === 'upi') {
    //         if (empty($validated['upi_number']) || empty($validated['upi_transaction_id'])) {
    //             return response()->json([
    //                 'success' => false,
    //                 'message' => 'UPI number and transaction ID are required for UPI payments.',
    //             ], 422);
    //         }
    //     }

    //     $visitorId = $request->input('visitor_id');
    //     $visitor = Visitor::find($visitorId);

    //     $visitor->update([
    //         'payment_mode' => $validated['payment_mode'],
    //         'upi_number' => $validated['upi_number'] ?? null,
    //         'transaction_id' => $validated['upi_transaction_id'] ?? null,
    //         'status' => 'paid',
    //     ]);

    //     return response()->json([
    //         'success' => true,
    //         'message' => 'Payment collected successfully.',
    //     ]);
    // }

    public function update(Request $request, Visitor $visitor)
    {
        $validated = $request->validate([
            'payment_mode' => ['required', Rule::in(['cash', 'card', 'upi'])],
            'upi_number' => ['nullable', 'string', 'max:255'],
            'upi_transaction_id' => ['nullable', 'string', 'max:255'],
        ]);

        if ($validated['payment_mode'] === 'upi') {
            if (empty($validated['upi_number']) || empty($validated['upi_transaction_id'])) {
                return response()->json([
                    'success' => false,
                    'message' => 'UPI number and transaction ID are required for UPI payments.',
                ], 422);
            }
        }

        $visitor->update([
            'payment_mode' => $validated['payment_mode'],
            'upi_number' => $validated['upi_number'] ?? null,
            'upi_transaction_id' => $validated['upi_transaction_id'] ?? null,
            'status' => 'paid',
        ]);

        return response()->json([
            'success' => true,
            'message' => 'Payment collected successfully.',
        ]);
    }

    public function getMeetingByDate(Request $request)
    {
        $date = $request->input('date');

        if (!$date) {
            return response()->json([
                'success' => false,
                'message' => 'Date is required.',
            ], 400);
        }

        $meeting = MeetingSchedule::with('month')
            ->whereDate('meeting_date', $date)
            ->first();

        if (!$meeting) {
            return response()->json([
                'success' => false,
                'message' => 'No meeting scheduled for this date.',
            ], 404);
        }

        return response()->json([
            'success' => true,
            'data' => [
                'meeting_id' => $meeting->meeting_id,
                'date' => $meeting->meeting_date,
                'month' => $meeting->month->name ?? 'N/A',
                'year' => $meeting->month->year ?? 'N/A',
                'week' => $meeting->week,
                'status' => $meeting->status,
            ],
        ]);
    }
}
