/home/brandsfa/www/app/Http/Controllers/Vendor/Coupon/CouponController.php
<?php

namespace App\Http\Controllers\Vendor\Coupon;

use App\Contracts\Repositories\CouponRepositoryInterface;
use App\Contracts\Repositories\CustomerRepositoryInterface;
use App\Enums\ViewPaths\Vendor\Coupon;
use App\Http\Controllers\BaseController;
use App\Http\Requests\Vendor\CouponRequest;
use App\Http\Requests\Vendor\CouponUpdateRequest;
use App\Services\CouponService;
use Brian2694\Toastr\Facades\Toastr;
use Illuminate\Contracts\View\View;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;

class CouponController extends BaseController
{
    /**
     * @param CouponRepositoryInterface $couponRepo
     * @param CustomerRepositoryInterface $customerRepo
     */
    public function __construct(
        private readonly CouponRepositoryInterface   $couponRepo,
        private readonly CustomerRepositoryInterface $customerRepo,
    )
    {
    }

    /**
     * @param Request|null $request
     * @param string|null $type
     * @return View|Collection|LengthAwarePaginator|callable|RedirectResponse|null
     */
    public function index(?Request $request, string $type = null): View|Collection|LengthAwarePaginator|null|callable|RedirectResponse
    {
        return $this->getAddListView(request:$request);
    }


    /**
     * @param object $request
     * @return View
     */
    public function getAddListView(object $request): View
    {
        $vendorId = auth('seller')->id();
        $searchValue = $request['searchValue'];
        $coupons = $this->couponRepo->getListWhere(
            orderBy: ['id'=>'desc'],
            searchValue: $searchValue,
            filters:['added_by' => 'seller', 'vendorId'=> $vendorId],
            dataLimit: getWebConfig(name: 'pagination_limit')
        );
        $customers = $this->customerRepo->getListWhereNotIn([0]);
        return view(Coupon::INDEX[VIEW], compact('coupons', 'customers', 'searchValue'));
    }

    /**
     * @param CouponRequest $request
     * @param CouponService $couponService
     * @return RedirectResponse
     * @function add  is the adding request data to coupon table
     */
    public function add(CouponRequest $request,CouponService $couponService): RedirectResponse
    {
        if(!$couponService->checkConditions(request: $request)){
            return redirect()->back();
        }
        $this->couponRepo->add($couponService->getCouponData(request: $request, addedBy: 'seller'));
        Toastr::success(translate('coupon_added_successfully'));
        return redirect()->back();
    }

    /**
     * @param string|int $id
     * @return View
     * @function getUpdateView is the update view
     */
    public function getUpdateView(string|int $id): View
    {
        $coupon = $this->couponRepo->getFirstWhere(['id' => $id]);
        $customers = $this->customerRepo->getListWhereNotIn([0]);
        return view(Coupon::UPDATE[VIEW], compact('coupon', 'customers'));
    }

    /**
     * @param CouponUpdateRequest $request
     * @param CouponService $couponService
     * @param string|int $id
     * @return RedirectResponse
     * @function update is the update the coupon table
     */
    public function update(CouponUpdateRequest $request, string|int $id,CouponService $couponService): RedirectResponse
    {
        if(!$couponService->checkConditions(request: $request)){
            return redirect()->back();
        }
        $this->couponRepo->update(id: $id, data: $couponService->getCouponData(request:$request, addedBy: 'seller'));
        Toastr::success(translate('coupon_update_successfully'));
        return redirect()->route(Coupon::INDEX[ROUTE]);
    }

    /**
     * @param string|int $id
     * @param string|int $status
     * @return JsonResponse
     * @function updateStatus ,update the coupon status
     *
     */
    public function updateStatus(string|int $id, string|int $status): JsonResponse
    {
        $coupon = $this->couponRepo->getFirstWhere(['added_by' => 'seller', 'coupon_bearer' => 'seller', 'id' => $id]);
        $this->couponRepo->update(id: $coupon['id'], data: ['status' => $status]);
        return response()->json([
            'status' => 1,
            'message' => translate('coupon_status_updated')
        ]);
    }

    /**
     * @param string|int $id
     * @return RedirectResponse
     * @function delete,delete coupon from coupon table
     */
    public function delete(string|int $id): RedirectResponse
    {
        $coupon = $this->couponRepo->getFirstWhere(['added_by' => 'seller', 'coupon_bearer' => 'seller', 'id' => $id]);
        if (in_array($coupon['seller_id'], [auth('seller')->id(), 0])) {
            $this->couponRepo->delete(params: ['id' => $id]);
            Toastr::success(translate('coupon_deleted_successfully'));
        } else {
            Toastr::warning(translate('coupon_not_found'));
        }
        return redirect()->back();
    }


    /**
     * @param Request $request
     * @return JsonResponse
     * @function getQuickView showing quick view of coupon details
     */
    public function getQuickView(Request $request): JsonResponse
    {
        $coupon = $this->couponRepo->getFirstWhere(['id' => $request['id']]);
        return response()->json([
            'view' => view(Coupon::QUICK_VIEW[VIEW], compact('coupon'))->render(),
        ]);
    }


}