<?php

namespace App\Libs\Services;

use App\Exceptions\ApiHttpException;
use MailerLiteApi\Api\Subscribers;
use MailerLiteApi\Common\Collection;
use MailerLiteApi\MailerLite;
use Throwable;
use Illuminate\Support\Facades\Log;

class NewsletterSubscriptionService
{


    /**
     * Gets the subscribers api object
     * 
     * @throws ApiHttpException
     * @return Subscribers
     */
    private function getSubscribersObject(): Subscribers
    {
        $apiKey = config('mailerlite.key');
        if (!$apiKey) {
            Log::error('Missing mailer lite API key.');
            throw new ApiHttpException(500, 'mailite_api_key_missing');
        }
        /**@var Subscribers $subscribersApi */
        $subscribersApi = (new MailerLite($apiKey))->subscribers();

        return $subscribersApi;
    }

    /**
     * Subscribes an email to the mailerLite list
     * @param string $email
     * @throws ApiHttpException
     * @return bool
     */
    public function subscribe(string $email): bool
    {

        /**@var Subscribers $subscribersApi */
        $subscribersApi  = $this->getSubscribersObject();
        $subscriber      = [
            'email' => $email,
        ];
        $addedSubscriber = $subscribersApi->create($subscriber);
        if (isset($addedSubscriber->error)) {
            Log::error('Error in creating newsletter subscription for ' . $email);
            throw new ApiHttpException(500, 'nl_subscription_error');
        }


        return isset($addedSubscriber->id) ? true : false;
    }

    /**
     * Unsubscribes an email from the mailerLite list
     * @param string $email
     * @throws ApiHttpException
     * @return bool
     */
    public function unsubscribe(string $email): bool
    {

        /**@var Subscribers $subscribersApi */
        $subscribersApi = $this->getSubscribersObject();


        //get the current subscription to use the id
        /** @var Collection $subscriptions */
        $subscriptions = $subscribersApi->search($email);
        if (count($subscriptions) > 0) {
            $subscription      = $subscriptions[0];

            if ($subscription->email !== $email) {
                return false;
            }

            $removedSubscriber = $subscribersApi->delete($subscription->id);
            if (isset($removedSubscriber->error)) {
                throw new ApiHttpException(500, 'nl_unsubscription_error');
            }

            return true;
        }

        return true;
    }
}
