<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;

class TransactionController extends Controller
{
    // ১. ডাটা লোড এবং ভিউ রিটার্ন (একই মেথডে)
    public function index(Request $request)
    {
        // রিকোয়েস্ট যদি AJAX হয় তবে শুধু JSON ডাটা দিবে
        if ($request->ajax()) {
            $query = DB::table('transactions')
                ->join('chart_of_accounts', 'transactions.account_head_id', '=', 'chart_of_accounts.id')
                ->select('transactions.*', 'chart_of_accounts.head_name');

            // ডেট ফিল্টারিং লজিক
            if ($request->from_date && $request->to_date) {
                $query->whereBetween('transaction_date', [$request->from_date, $request->to_date]);
            }

            $transactions = $query->orderBy('transaction_date', 'desc')->get();

            return response()->json([
                'status' => 'success', 
                'data' => $transactions
            ]);
        }

        // প্রথমবার পেজ লোড হলে চার্ট অফ অ্যাকাউন্টস এর হেডগুলো নিয়ে ভিউতে যাবে
        $heads = DB::table('chart_of_accounts')->get();
        return view('admin.accounts.transactions', compact('heads'));
    }

    // ২. নতুন লেনদেন সেভ করা (AJAX)
    public function store(Request $request)
    {
        // ভ্যালিডেশন
        $validator = Validator::make($request->all(), [
            'transaction_date' => 'required|date',
            'account_head_id'  => 'required|integer',
            'amount'           => 'required|numeric|min:0',
        ]);

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

        // অ্যাকাউন্ট হেড থেকে অটোমেটিক টাইপ (Income/Expense) খুঁজে নেওয়া
        $head = DB::table('chart_of_accounts')->where('id', $request->account_head_id)->first();

        if (!$head) {
            return response()->json(['status' => 'error', 'message' => 'অ্যাকাউন্ট হেড পাওয়া যায়নি'], 404);
        }

        DB::table('transactions')->insert([
            'transaction_date' => $request->transaction_date,
            'account_head_id'  => $request->account_head_id,
            'transaction_type' => $head->head_type, // স্বয়ংক্রিয়ভাবে টাইপ সেট হচ্ছে
            'amount'           => $request->amount,
            'ref_table'        => $request->ref_table ?? 'expenses', // ডিফল্ট এক্সপেন্স
            'description'      => $request->description,
            'created_at'       => now()
        ]);

        return response()->json(['status' => 'success', 'message' => 'লেনদেন সফলভাবে সংরক্ষিত হয়েছে।']);
    }

    // ৩. এডিটের জন্য ডাটা দেখানো (AJAX)
    public function show($id)
    {
        $data = DB::table('transactions')->where('id', $id)->first();
        
        if (!$data) {
            return response()->json(['status' => 'error', 'message' => 'ডাটা পাওয়া যায়নি'], 404);
        }

        return response()->json(['status' => 'success', 'data' => $data]);
    }

    // ৪. লেনদেন আপডেট করা (AJAX)
    public function update(Request $request, $id)
    {
        // আপডেট করার সময়ও হেড চেক করে টাইপ আপডেট করা ভালো
        $head = DB::table('chart_of_accounts')->where('id', $request->account_head_id)->first();

        DB::table('transactions')->where('id', $id)->update([
            'transaction_date' => $request->transaction_date,
            'account_head_id'  => $request->account_head_id,
            'transaction_type' => $head->head_type,
            'amount'           => $request->amount,
            'description'      => $request->description,
            'updated_at'       => now()
        ]);

        return response()->json(['status' => 'success', 'message' => 'লেনদেনের তথ্য সফলভাবে আপডেট হয়েছে।']);
    }
}