<?php

namespace App\Http\Controllers\Backoffice;

use App\Http\Controllers\Controller;
use App\Facades\Backoffice\BackendUserService;
use App\Facades\SubscriptionsService;
use App\Http\Requests\Backoffice\AdminContentAutoComplete;
use App\Http\Requests\Backoffice\ContentTypeListRequest;
use App\Http\Requests\Backoffice\SubscriptionPlanRequest;
use App\Http\Resources\Backoffice\SubscriptionPlans\SubscriptionPlanResource;
use App\Http\Resources\Backoffice\SubscriptionPlans\SubscriptionRewardResource;
use App\Models\Feature;
use App\Models\Subscription;
use App\Models\SubscriptionPlan;
use App\Models\SubscriptionPlanOption;
use App\Models\SubscriptionReward;
use Illuminate\Support\Facades\Session;
use Inertia\Inertia;

class SubscriptionPlansController extends Controller
{
    /* BO Function */
    public function getIndex()
    {
        $loggedUser = BackendUserService::getLoggedUser();

        return Inertia::render('Backoffice/SubscriptionPlans/ListSubscriptionPlans', [
            'data' => [
                'user'          => $loggedUser,
            ]
        ]);
    }

    public function getSubscriptionPlans(ContentTypeListRequest $request)
    {
        $data = $request->validated();

        $loggedUser = BackendUserService::getLoggedUser();

        if (!empty($userId) && $loggedUser->id != $userId
            && !$loggedUser->hasPermission("accounts.manage")) {
            abort(403);
        }

        $list = SubscriptionsService::getSubscriptionPlans($data);

        return SubscriptionPlanResource::collection($list);
    }

    public function getSubscriptionRewards()
    {
        $list = SubscriptionReward::full()->get();

        return SubscriptionRewardResource::collection($list);
    }

    public function getEdit($planId = null)
    {
        $loggedUser = BackendUserService::getLoggedUser();

        if (!$loggedUser->hasPermission("accounts.manage")) {
            abort(403);
        }

        if (!empty($planId)) {
            $plan = SubscriptionPlan::with('features')->find($planId);
            if (!$plan) {
                abort(404);
            }
        } else {
            $plan = new SubscriptionPlan();
        }

        $availableFeatures = Feature::all();

        return Inertia::render('Backoffice/SubscriptionPlans/EditSubscriptionPlan', [
            'data' => new SubscriptionPlanResource($plan),
            'availableFeatures' => $availableFeatures,
            'id' => intval($planId),
            'message' => Session::get('message'),
            'errorMessage' => Session::get('errorMessage')
        ]);
    }

    public function postEdit(SubscriptionPlanRequest $request, $planId = null)
    {
        $data = $request->validated();

        $loggedUser = BackendUserService::getLoggedUser();

        if (!$loggedUser->hasPermission("accounts.manage")) {
            abort(403);
        }

        $plan = null;

        if (!empty($planId)) {
            $plan = SubscriptionPlan::with('features')->find($planId);
            if (!$plan) {
                abort(404);
            }
        }

        $plan = SubscriptionsService::saveSubscriptionPlan($data, $plan);

        return new SubscriptionPlanResource($plan);
    }

    public function postSubscriptionPlanOptionsAutoComplete(AdminContentAutoComplete $request)
    {
        $data = $request->validated();
        $searchTerm = urldecode($data['searchTerm']);
        $exactId = !empty($data['id']) ? $data['id'] : null;

        $query = SubscriptionPlanOption::with('subscriptionPlan');

        if (!empty($searchTerm)) {
            $query->where('name', 'like', "%$searchTerm%");
        }

        if (!is_null($exactId)) {
            $query->where('id', $exactId);
        }

        $planOptions = $query->limit(20)->get();

        return response()->json($planOptions->map(function ($option) {
            return [
                'id' => $option->id,
                'title' => $option->subscriptionPlan->name . ' - ' . $option->name ,
            ];
        }));
    }

    public function postSubscriptionPlanAutoComplete(AdminContentAutoComplete $request)
    {
        $data = $request->validated();
        $searchTerm = urldecode($data['searchTerm']);
        $exactId = !empty($data['id']) ? $data['id'] : null;

        $query = SubscriptionPlan::query();

        if (!empty($searchTerm)) {
            $query->where('name', 'like', "%$searchTerm%");
        }

        if (!is_null($exactId)) {
            $query->where('id', $exactId);
        }

        $subscriptions = $query->limit(20)->get();

        return response()->json($subscriptions->map(function ($option) {
            return [
                'id' => $option->id,
                'title' => $option->name,
            ];
        }));
    }
}
