<?php

namespace App\Http\Controllers;

use App\Models\OmsDealer;
use App\Models\OmsClient;
use App\Models\FoodDistribution;
use Carbon\Carbon;
use Illuminate\Http\Request;

class FoodDistributionController extends Controller
{
    // ১. Word/Dealer সিলেক্ট করার পেজ
    public function selectWord()
    {
        $dealers = OmsDealer::select('id', 'dealer_name', 'word_number', 'sale_point')->get();
        return view('pages.distributions.select_word', compact('dealers'));
    }

    // ২. সিলেক্ট করার পর ডিস্ট্রিবিউট পেজে রিডাইরেক্ট
    public function processWord(Request $request)
    {
        $request->validate(['dealer_id' => 'required|exists:oms_dealers,id']);
        return redirect()->route('distributions.distribute', $request->dealer_id);
    }

    // ৩. ডিস্ট্রিবিউট পেজ ভিউ (ক্যামেরা স্ক্যানার সহ)
    public function distribute($dealer_id)
    {
        $dealer = OmsDealer::findOrFail($dealer_id);
        return view('pages.distributions.distribute', compact('dealer'));
    }

    // ৪. QR Code (NID) স্ক্যান করার পর ভেরিফিকেশন এবং স্টোর (AJAX)
    public function scanVerify(Request $request)
    {
        $request->validate([
            'nid_number' => 'required|string',
            'dealer_id' => 'required|exists:oms_dealers,id'
        ]);

        $dealer = OmsDealer::findOrFail($request->dealer_id);
        $client = OmsClient::where('nid_number', $request->nid_number)->first();

        // ভেরিফিকেশন: ক্লায়েন্ট ডেটাবেজে আছে কি না
        if (!$client) {
            return response()->json([
                'status' => 'error',
                'message' => 'এই NID এর কোনো ভোক্তা পাওয়া যায়নি!'
            ]);
        }

        // ভেরিফিকেশন ১: Word Number ম্যাচ করে কি না
        if ((string) $client->word_no !== (string) $dealer->word_number) {
            return response()->json([
                'status' => 'error',
                'message' => 'ভোক্তা এই ওয়ার্ড এর সদস্য নয়!'
            ]);
        }

        // ভেরিফিকেশন ২: ১ দিন গ্যাপ চেক (পরপর দুইদিন নেওয়া যাবে না)
        $lastDistribution = FoodDistribution::where('client_id', $client->id)
            ->latest('distributed_at')
            ->first();

        if ($lastDistribution) {
            $lastDate = Carbon::parse($lastDistribution->distributed_at)->startOfDay();
            $today = Carbon::today();
            $diffDays = $today->diffInDays($lastDate);

            // যদি ডিফারেন্স ১ দিন বা ০ দিন (আজকেই নিয়েছে) হয়
            if ($diffDays <= 1) {
                // কবে নিতে পারবে সেটার ডেট
                $nextEligibleDate = $lastDate->copy()->addDays(2)->format('d F Y');
                return response()->json([
                    'status' => 'error',
                    'message' => "ভোক্তা শেষ বিক্রয় দিবসে পণ্য নিয়েছে! পরবর্তী বিক্রয় দিবস: {$nextEligibleDate}"
                ]);
            }
        }

        // সব শর্ত পূরণ হলে ডাটা সেভ হবে
        FoodDistribution::create([
            'dealer_id' => $dealer->id,
            'client_id' => $client->id,
            'distributor_id' => auth()->id(),
            'nid_number' => $client->nid_number,
            'word_number' => $dealer->word_number,
            'distributed_at' => Carbon::today()->toDateString(),
        ]);

        return response()->json([
            'status' => 'success',
            'message' => 'পণ্য সফলভাবে বিতরণ করা হয়েছে!',
            'client_name' => $client->client_name
        ]);
    }

    public function index(Request $request)
    {
        $query = FoodDistribution::with(['client', 'dealer', 'user']);

        // ১. লাইভ টেক্সট সার্চ (NID অথবা ভোক্তার নাম)
        if ($request->filled('search')) {
            $search = $request->search;
            $query->where(function ($q) use ($search) {
                $q->where('nid_number', 'LIKE', "%{$search}%")
                    ->orWhereHas('client', function ($clientQuery) use ($search) {
                        $clientQuery->where('client_name', 'LIKE', "%{$search}%");
                    });
            });
        }

        // ২. ওয়ার্ড নম্বর ফিল্টার (Dropdown)
        if ($request->filled('word_number')) {
            $query->where('word_number', $request->word_number);
        }

        // ৩. সেল পয়েন্ট / ডিলার ফিল্টার (Dropdown)
        if ($request->filled('dealer_id')) {
            $query->where('dealer_id', $request->dealer_id);
        }

        // ৪. ডেট রেঞ্জ ফিল্টার (Date Range)
        if ($request->filled('start_date')) {
            $query->whereDate('distributed_at', '>=', $request->start_date);
        }
        if ($request->filled('end_date')) {
            $query->whereDate('distributed_at', '<=', $request->end_date);
        }

        // ড্রপডাউন ডেটা লোড করার জন্য
        $dealers = OmsDealer::all();
        $wordNumbers = FoodDistribution::distinct()->whereNotNull('word_number')->pluck('word_number');

        // পেজিনেশনসহ ডেটা পাস
        $distributions = $query->latest()->paginate(20)->withQueryString();

        return view('pages.distributions.index', compact('distributions', 'dealers', 'wordNumbers'));
    }

    public function print(Request $request)
    {
        // ইনডেক্সের মত হুবহু এক ফিল্টারিং লজিক
        $query = FoodDistribution::with(['client', 'dealer', 'user']);

        if ($request->filled('search')) {
            $search = $request->search;
            $query->where(function ($q) use ($search) {
                $q->where('nid_number', 'LIKE', "%{$search}%")
                    ->orWhereHas('client', function ($clientQuery) use ($search) {
                        $clientQuery->where('client_name', 'LIKE', "%{$search}%");
                    });
            });
        }

        if ($request->filled('word_number')) {
            $query->where('word_number', $request->word_number);
        }

        if ($request->filled('dealer_id')) {
            $query->where('dealer_id', $request->dealer_id);
        }

        if ($request->filled('start_date')) {
            $query->whereDate('distributed_at', '>=', $request->start_date);
        }
        if ($request->filled('end_date')) {
            $query->whereDate('distributed_at', '<=', $request->end_date);
        }

        $distributions = $query->latest()->get();

        // --- ডাইনামিক হেডার ইনফরমেশন লজিক ---
        $printSalePoint = 'All Sale Point';
        $printWordNumber = 'All Word';
        $printDealerName = 'All Dealer';

        if ($request->filled('dealer_id')) {
            // ডিলার সিলেক্ট করলে তার সব তথ্য অটো চলে আসবে
            $dealer = OmsDealer::find($request->dealer_id);
            if ($dealer) {
                $printDealerName = $dealer->dealer_name;
                $printSalePoint = $dealer->sale_point;
                $printWordNumber = 'Word ' . $dealer->word_number;
            }
        } elseif ($request->filled('word_number')) {
            // শুধু ওয়ার্ড সিলেক্ট করলে ওই ওয়ার্ডের ১ম ডিলারের তথ্য অটো লোড হবে
            $printWordNumber = 'Word ' . $request->word_number;
            $dealer = OmsDealer::where('word_number', $request->word_number)->first();
            if ($dealer) {
                $printDealerName = $dealer->dealer_name;
                $printSalePoint = $dealer->sale_point;
            }
        }

        return view('pages.distributions.print', compact(
            'distributions',
            'printSalePoint',
            'printWordNumber',
            'printDealerName'
        ));
    }
}