<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Invoice;
use App\Models\InvoiceItem;
use App\Models\Student;
use App\Models\FeeType;
use App\Models\StudentWaiver;
use App\Models\Section;
use DB;

class InvoiceController extends Controller
{
    /**
     * ফি জেনারেশন প্রসেস
     */
    public function generate(Request $request)
	{
		// ১. ফি-র পরিমাণ এবং স্টুডেন্ট লিস্ট বের করা (আগের মতোই)
		$classWiseFee = DB::table('class_wise_fees')
						->where('class_id', $request->class_id)
						->where('fee_type_id', $request->fee_type_id)
						->first();

		if (!$classWiseFee) {
			return response()->json(['status' => 'error', 'message' => 'এই ক্লাসের জন্য ফি সেট করা নেই!']);
		}

		$baseAmount = $classWiseFee->default_amount ?? $classWiseFee->default_amount;
		$students = Student::where('class_id', $request->class_id)->get();

		DB::beginTransaction();
		try {
			foreach ($students as $student) {
				
				// ২. ডুপ্লিকেট আইটেম চেক (একই ফি যেন দুইবার না ঢুকে)
				$itemExists = DB::table('invoice_items')
								->join('invoices', 'invoice_items.invoice_id', '=', 'invoices.id')
								->where('invoices.student_id', $student->id)
								->where('invoices.month', $request->month)
								->where('invoices.year', $request->year)
								->where('invoice_items.fee_type_id', $request->fee_type_id)
								->exists();

				if ($itemExists) continue;

				// ৩. বিদ্যমান 'Unpaid' মাস্টার ইনভয়েস আছে কি না দেখা
				$invoice = Invoice::where('student_id', $student->id)
								->where('status', '!=', 'Paid') // পেইড না হলে সেটাতেই ঢুকবে
								->first();

				// ৪. ওয়েভার ক্যালকুলেশন
				$waiver = StudentWaiver::where('student_id', $student->id)
								->where('fee_type_id', $request->fee_type_id)
								->where('is_active', 1)
								->first();

				$discountAmount = 0;
				if ($waiver) {
					$discountAmount = ($waiver->discount_type == 'Percentage') 
									? ($baseAmount * $waiver->discount_value / 100) 
									: $waiver->discount_value;
				}
				$netAmount = $baseAmount - $discountAmount;

				if ($invoice) {
					// ৫. মাস্টার ইনভয়েস আপডেট করা (বিদ্যমান ইনভয়েস থাকলে)
					$invoice->total_amount += $netAmount;
					$invoice->due_amount += $netAmount;
					$invoice->save();
				} else {
					// ৬. নতুন মাস্টার ইনভয়েস তৈরি করা (যদি না থাকে)
					$invoice = Invoice::create([
						'student_id'   => $student->id,
						'invoice_no'   => 'INV-' . date('Ym') . rand(1000, 9999),
						'total_amount' => $netAmount,
						'due_amount'   => $netAmount,
						'month'        => $request->month,
						'year'         => $request->year,
						'status'       => 'Unpaid'
					]);
				}

				// ৭. ইনভয়েস আইটেম তৈরি
				InvoiceItem::create([
					'invoice_id'      => $invoice->id,
					'fee_type_id'     => $request->fee_type_id,
					'amount'          => $baseAmount,
					'discount_amount' => $discountAmount,
					// 'net_amount'   => $netAmount, // Generated Column হলে বাদ দিন
					'due_amount'      => $netAmount,
					'status'          => 'Unpaid'
				]);

				// ৮. স্টুডেন্ট লেজার এন্ট্রি
				$lastBalance = DB::table('student_ledgers')
								->where('student_id', $student->id)
								->orderBy('id', 'desc')
								->value('balance') ?? 0;

				DB::table('student_ledgers')->insert([
					'student_id'     => $student->id,
					'date'           => now()->format('Y-m-d'),
					'description'    => "ফি যুক্ত করা হয়েছে (ফি টাইপ আইডি: " . $request->fee_type_id . ", ইনভয়েস: " . $invoice->invoice_no . ")",
					'debit'          => $netAmount,
					'credit'         => 0,
					'balance'        => $lastBalance + $netAmount,
					'reference_type' => 'Invoice',
					'reference_id'   => $invoice->id,
					'created_at'     => now(),
				]);
			}

			DB::commit();
			return response()->json(['status' => 'success', 'message' => 'ইনভয়েস আপডেট/জেনারেট হয়েছে!']);

		} catch (\Exception $e) {
			DB::rollback();
			return response()->json(['status' => 'error', 'message' => $e->getMessage()]);
		}
	}

	public function getDetails($id)
	{
		// ১. ইনভয়েস এবং স্টুডেন্ট ডাটা (এটি ঠিকঠাক কাজ করছে)
		$invoice = Invoice::with('student')->findOrFail($id);
		
		// ২. সরাসরি DB Join ব্যবহার করে আইটেম এবং ফি টাইপের নাম নিয়ে আসা
		$items = DB::table('invoice_items')
			->join('fee_types', 'invoice_items.fee_type_id', '=', 'fee_types.id')
			->where('invoice_items.invoice_id', $id)
			->select(
				'invoice_items.*', 
				'fee_types.type_name as type_name' // সরাসরি ফি টাইপের নাম সিলেক্ট করা
			)
			->get();

		// ৩. জাভাস্ক্রিপ্টের ফরম্যাট অনুযায়ী ডাটা ম্যাপ করা
		$data = $items->map(function($item) {
			return [
				'id' => $item->id,
				// যদি net_amount কলামে ভ্যালু না থাকে তবে ক্যালকুলেশন করে নেওয়া
				'net_amount' => $item->net_amount ?? ($item->amount - $item->discount_amount),
				'fee_type' => [
					'type_name' => $item->type_name // জয়েন করা নাম ব্যবহার করা হলো
				]
			];
		});

		return response()->json([
			'invoice' => $invoice,
			'items'   => $data
		]);
	}
    public function index()
	{
		$data['invoices'] = Invoice::with('student')->orderBy('id', 'desc')->take(100)->get();
		$data['classes'] = DB::table('classes')->get(); 
		$data['sections'] = DB::table('sections')->get(); 
		$data['feeTypes'] = DB::table('fee_types')->get(); 
		
		return view('admin.invoices.index', $data);
	}
	
	public function printInvoice($id)
	{
		$school = DB::table('company_profiles')->first();

		$invoice = DB::table('invoices')
			->join('students', 'invoices.student_id', '=', 'students.id')
			->join('classes', 'students.class_id', '=', 'classes.id')
			->where('invoices.id', $id)
			->select('invoices.*', 'students.student_name_en', 'students.admission_no', 'classes.class_name')
			->first();

		$items = DB::table('invoice_items')
			->join('fee_types', 'invoice_items.fee_type_id', '=', 'fee_types.id')
			->where('invoice_items.invoice_id', $id)
			->select('invoice_items.*', 'fee_types.type_name')
			->get();

		return view('admin.invoices.print_invoice', compact('invoice', 'items', 'school'));
	}
}