<?php

declare(strict_types=1);

namespace App\Http\Controllers\Backend;

use App\Helpers\BudgetHelper;
use App\Http\Controllers\Controller;
use App\Models\BudgetControl;
use App\Models\BudgetControlLog;
use App\Models\Admin;
use Illuminate\Http\Request;
use App\Models\FormUpCountry;
use App\Models\FormMeetingSeminar;
use App\Models\FormOthers;
use App\Models\FormEntertaimentPresentation;
use App\Models\FormVehicleRunningCost;
use App\Models\UserHasCabang;

class BudgetControlController extends Controller
{
    public function index()
	{
		$this->checkAuthorization(auth()->user(), ['budget_control.view']);
		session()->put('redirect_url', route('budget_control'));

		$role = auth()->user()->getRoleNames()[0];
		$budget = null;

		if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') {
			$region_id = auth()->user()->getMyCabangAndRegionId()['region'];

			if ($region_id) {
				$budget = BudgetControl::whereHas('cabang', function ($query) use ($region_id) {
					$query->where('region_id', $region_id);
				})->with(['receiver', 'sender', 'cabang'])->get();
			}
		} elseif ($role == 'Area Manager Cabang') {
			$cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang'];

			if ($cabang_id) {
				$budget = BudgetControl::where('cabang_id', $cabang_id)
					->with(['receiver', 'sender', 'cabang'])
					->get();
			}
		} else {
			$budget = BudgetControl::with(['receiver', 'sender', 'cabang'])->get();
		}

		// Calculate usedBudget and availableBudget for each cabang
		$budget->map(function ($b) {
			$b->availableBudget = BudgetHelper::getAvailableBudget($b->cabang_id);

			return $b;
		});

		return view('backend.pages.budget_control.index', [
			'data' => $budget,
		]);
	}

	public function log()
    {
		$this->checkAuthorization(auth()->user(), ['budget_control.view']);
		session()->put('redirect_url', route('budget_control'));

        return view(
            'backend.pages.budget_control.log',
            [
                'data' => BudgetControlLog::orderBy('created_at', 'desc')->with(['receiver', 'sender', 'cabang'])->get(),
            ]
        );
    }

	public function create()
	{
		$this->checkAuthorization(auth()->user(), ['budget_control.create']);
		$users = Admin::getUserByRoleName('Area Manager Cabang');

		return view('backend.pages.budget_control.create', [
			'users' => $users,
		]);
	}

	public function store(Request $request)
	{
		$this->checkAuthorization(auth()->user(), ['budget_control.create']);

		$validated = $request->validate([
			'receiver_id' => 'required|exists:admins,id',
			'periode_month' => 'required|string|in:january,february,march,april,may,june,july,august,september,october,november,december',
			'periode_year' => 'required|numeric',
			'amount' => 'required|numeric',
			'remarks' => 'nullable|string',
		]);

		$cabang_id = Admin::find($validated['receiver_id'])->getMyCabangAndRegionId()['cabang'];
		BudgetControl::updateOrCreate(['cabang_id' => $cabang_id],
		[
			'sender_id' => auth()->user()->id,
			'receiver_id' => $validated['receiver_id'],
			'periode_month' => $validated['periode_month'],
			'periode_year' => $validated['periode_year'],
			'amount' => $validated['amount'],
			'remarks' => $validated['remarks'],
			'closing_at' => null,
			'status' => 'Assigned',
		]);

		session()->flash('success', 'Budget has been added or updated successfully');
		return redirect()->route('budget_control');
	}

	public function destroy($id)
	{
		$this->checkAuthorization(auth()->user(), ['budget_control.delete']);

		$budgetRequest = BudgetControl::findOrfail($id);
		$budgetRequest->delete();

		return redirect()->route('budget_control');
	}
}
