<?php

namespace App\Http\Controllers\Api\V1;

use Symfony\Component\HttpFoundation\JsonResponse;
use App\Http\Requests\V1\FcmTopicRequest;
use App\Libs\Services\FcmService;
use App\Services\UserDataService;
use Illuminate\Support\Facades\Auth;


class FcmController extends ApiController
{

    private FcmService $fcmService;
    private UserDataService $userDataService;

    /**
     * Class constructor
     *
     * @param FcmService $fcmService
     * @param UserDataService $userDataService
     * @return void
     */
    public function __construct(FcmService $fcmService, UserDataService $userDataService)
    {
        $this->fcmService      = $fcmService;
        $this->userDataService = $userDataService;
    }

    /**
     * Subscribes a user to a FCM topic
     *
     * @param App\Http\Requests\V1\FcmTopicRequest $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function subscribeToTopic(FcmTopicRequest $request): JsonResponse
    {

        $user  = Auth::user();
        $data  = $request->validated();
        $res    = $this->fcmService->subscribeToTopic($data['fcm_topic'], $user);

        $resData = [
            'message' => $res ? trans('response.fcm_topic_subscription_ok') : trans('response.error_fcm_topic_subscription'),
            'data'    => $data,
        ];
        return response()->json($resData, 200);
    }

    /**
     * Unsubscribes a user to a FCM topic from FCM and database
     *
     * @param App\Http\Requests\V1\FcmTopicRequest $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function unsubscribeToTopic(FcmTopicRequest $request): JsonResponse
    {

        $user          = Auth::user();
        $data          = $request->validated();
        $unsubscribed  = $this->fcmService->unsubscribeToTopic($user, $data['fcm_topic']);

        if ($unsubscribed) {
            //the topic has been unsubscribed, removing the local subscription
            $this->userDataService->removeUserFcmSubscription($user, $data['fcm_topic']);
        }

        $resData = [
            'message' => $unsubscribed ? trans('response.fcm_topic_unsubscription_ok') : trans('response.error_fcm_topic_unsubscription'),
            'data'    => $data,
        ];
        return response()->json($resData, 200);
    }


    /**
     * Unsubscribes a user from all FCM topics
     *
     * @param App\Http\Requests\V1\FcmTopicRequest $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function unsubscribeToAllTopics(): JsonResponse
    {

        $user  = Auth::user();
        $res = $this->fcmService->unsubscribeToAllTopics($user);

        if ($res) {
            //the topics were unsubscribed, removing them from the database
            $this->userDataService->removeAllUserFcmSubscription($user);
        }
        $resData = [
            'message' => $res ? trans('response.fcm_topic_unsubscription_ok') : trans('response.error_fcm_topic_unsubscription'),
        ];


        return response()->json($resData, 200);
    }


    /**
     * Gets a list of all the user subscribed topics for all tokens
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function getTopics(): JsonResponse
    {

        $user    = Auth::user();
        $topics  = $this->fcmService->getTopicsDataForUser($user);

        $resData = [
            'data' => [
                'topics' => array_unique($topics),
            ],
        ];
        return response()->json($resData, 200);
    }
}
