/home/brandsfa/www/app/Http/Controllers/Admin/Vendor/WithdrawalMethodController.php
<?php

namespace App\Http\Controllers\Admin\Vendor;

use App\Contracts\Repositories\WithdrawalMethodRepositoryInterface;
use App\Enums\ViewPaths\Admin\WithdrawalMethod;
use App\Enums\WebConfigKey;
use App\Http\Controllers\BaseController;
use App\Http\Requests\Admin\WithdrawalMethodRequest;
use App\Services\WithdrawalMethodService;
use App\Traits\CommonTrait;
use App\Traits\PaginatorTrait;
use App\Traits\PushNotificationTrait;
use Brian2694\Toastr\Facades\Toastr;
use Illuminate\Contracts\View\View;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class WithdrawalMethodController extends BaseController
{
    use PaginatorTrait;
    use CommonTrait;
    use PushNotificationTrait;

    public function __construct(
        private readonly WithdrawalMethodRepositoryInterface $withdrawalMethodRepo,
    )
    {
    }
    /**
     * @param Request|null $request
     * @param string|null $type
     * @return View
     * Index function is the starting point of a controller
     */
    public function index(Request|null $request, string $type = null): View
    {
        return $this->getListView($request);
    }

    public function getListView(Request $request): View
    {
        $withdrawalMethods = $this->withdrawalMethodRepo->getListWhere(
            orderBy: ['id'=>'desc'],
            searchValue: $request['searchValue'],
            dataLimit:getWebConfig(name: WebConfigKey::PAGINATION_LIMIT)
        );

        return view(WithdrawalMethod::LIST[VIEW], compact('withdrawalMethods'));
    }

    public function getAddView(): View
    {
        return view(WithdrawalMethod::ADD[VIEW]);
    }

    public function getUpdateView($id): View
    {
        $withdrawalMethod = $this->withdrawalMethodRepo->getFirstWhere(params: ['id' => $id]);
        return View(WithdrawalMethod::UPDATE[VIEW], compact('withdrawalMethod'));
    }

    public function add(WithdrawalMethodRequest $request, WithdrawalMethodService $withdrawalMethodService): RedirectResponse
    {
        $dataCount = $this->withdrawalMethodRepo->getListWhere(dataLimit: 'all')->count();
        $withdrawalMethod = $this->withdrawalMethodRepo->getFirstWhere(params: ['method_name' => $request['method_name']]);
        $data = $withdrawalMethodService->getProcessedData(request:$request, dataCount:$dataCount);

        if ($withdrawalMethod) {
            $this->withdrawalMethodRepo->update(id: $withdrawalMethod['id'], data: $data);
            $withdrawalMethodID = $withdrawalMethod['id'];
        }else {
            $withdrawalMethodObject = $this->withdrawalMethodRepo->add(data: $data);
            $withdrawalMethodID = $withdrawalMethodObject['id'];
        }

        if ($request->has('is_default') && $request['is_default'] == '1') {
            $this->withdrawalMethodRepo->updateWhereNotIn(params:['id' => [$withdrawalMethodID]], data: ['is_default' => 0]);
        }

        Toastr::success(translate('withdrawal_method_added_successfully'));
        return redirect()->route('admin.sellers.withdraw-method.list');
    }

    public function delete($id): RedirectResponse
    {
        $this->withdrawalMethodRepo->delete(params:['id'=>$id]);
        Toastr::success(translate('withdraw_method_removed_successfully'));
        return back();
    }

    public function updateDefaultStatus(Request $request): JsonResponse
    {
        $withdrawalMethod = $this->withdrawalMethodRepo->getFirstWhere(params: ['id' => $request['id']]);
        $success = 0;
        if($withdrawalMethod['is_active'] && !$withdrawalMethod['is_default']) {
            $success = 1;
            $this->withdrawalMethodRepo->updateWhereNotIn(params:['id' => [$request['id']]], data: ['is_default' => $withdrawalMethod['is_default']]);
            $this->withdrawalMethodRepo->update(id:$request['id'], data: ['is_default' => !$withdrawalMethod['is_default']]);
        }
        return response()->json([
            'success' => $success,
        ], 200);
    }

    public function updateStatus(Request $request): JsonResponse
    {
        $withdrawalMethod = $this->withdrawalMethodRepo->getFirstWhere(params: ['id' => $request['id']]);
        $success = 0;
        if(!$withdrawalMethod['is_default']) {
            $success = 1;
            $this->withdrawalMethodRepo->update(
                id:$request['id'],data: ['is_active' => ($withdrawalMethod['is_active'] == 0 || $withdrawalMethod['is_active'] == null) ? 1 : 0]
            );
        }
        return response()->json([
            'success' => $success,
        ], 200);
    }

    public function update(WithdrawalMethodRequest $request, WithdrawalMethodService $withdrawalMethodService): RedirectResponse
    {
        $withdrawalMethod = $this->withdrawalMethodRepo->getFirstWhere(params: ['method_name' => $request['method_name']]);
        if(!isset($withdrawalMethod)) {
            Toastr::error(translate('withdrawal_method_not_found'));
            return back();
        }
        $count = $this->withdrawalMethodRepo->getListWhere(dataLimit: 'all')->count();
        $data = $withdrawalMethodService->getProcessedData(request:$request, dataCount:$count);
        $this->withdrawalMethodRepo->update(id: $withdrawalMethod['id'], data: $data);
        if ($request->has('is_default') && $request['is_default'] == '1') {
            $this->withdrawalMethodRepo->updateWhereNotIn(params:['id' => [$withdrawalMethod['id']]], data: ['is_default' => 0]);
            $this->withdrawalMethodRepo->update(id:$withdrawalMethod['id'], data: ['is_active' => 1]);
        }
        Toastr::success(translate('withdrawal_method_added_successfully'));
        return redirect()->route('admin.sellers.withdraw-method.list');
    }
}