<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests\Api\SubscribeForm;
use App\Http\Requests\Api\SubscribeFormHubSpot;
use \Mailjet\Resources;
use HubSpot\Factory;
use HubSpot\Client\Crm\Contacts\ApiException as ContactsApiException;
use HubSpot\Client\Crm\Contacts\Model\Filter;
use HubSpot\Client\Crm\Contacts\Model\FilterGroup;
use HubSpot\Client\Crm\Contacts\Model\PublicObjectSearchRequest;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectInputForCreate;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Illuminate\Validation\ValidationException;

class SubscribeController extends Controller
{
    public function postCreate(SubscribeForm $request)
    {
        $data = $request->validated();

        if (empty(config('efet.mailjet.mj_apikey_public')) ||
            empty(config('efet.mailjet.mj_apikey_private')) ||
            empty(config('efet.mailjet.mj_contact_list'))) {
                return response([
                    'error' => 'error',
                ], 404);
        }

        $apikey = config('efet.mailjet.mj_apikey_public');
        $apisecret = config('efet.mailjet.mj_apikey_private');

        $mj = new \Mailjet\Client($apikey, $apisecret, true, ['version' => 'v3']);

        $body = [
            'Name' => "",
            'Properties' => "",
            'Action' => "addforce",
            'Email' => $data['email']
        ];
        $response = $mj->post(Resources::$ContactslistManagecontact, ['id' => config('efet.mailjet.mj_contact_list'), 'body' => $body]);

        return response([
            'success' => 'Success',
            // 'data' => $response->getData()
        ], 200);
    }

    public function postCreateHubSpot(SubscribeFormHubSpot $request)
    {
        $data = $request->validated();
        $apiKey = config('efet.hubspot.api_key');
        $recaptcha = checkRecaptcha($data['tokenRecaptcha'], 'form_newsletter_subscribe');

        if (!$recaptcha) {
            throw ValidationException::withMessages([
                'error' => ['Invalid Recaptcha'],
            ]);
        }

        if (empty($apiKey)) {
            Log::error('HubSpot API key is not configured');
            return response([
                'error' => 'Service not configured',
            ], 500);
        }

        try {
            $hubspot = Factory::createWithAccessToken($apiKey);


            // Create or update contact in HubSpot
            $contactResponse = $this->createOrUpdateHubSpotContact($hubspot, $data);

            if (!$contactResponse['success']) {
                return response([
                    'error' => $contactResponse['message'],
                ], 400);
            }

            // If topics are provided, add contact to the corresponding lists
            if (!empty($data['topics']) && is_array($data['topics'])) {
                foreach ($data['topics'] as $topic) {
                    $listName = 'Newsletter Website ' . ucwords(str_replace('-', ' ', $topic));
                    $listResponse = $this->addContactToHubSpotList($apiKey, $listName, $contactResponse['contactId']);

                    if (!$listResponse['success']) {
                        Log::warning('Failed to add contact to list: ' . $listResponse['message']);
                    }
                }
            }

            return response([
                'success' => true,
                'message' => 'Successfully subscribed to newsletter',
            ], 200);

        } catch (\Exception $e) {
            Log::error('HubSpot API error: ' . $e->getMessage());
            return response([
                'error' => $e->getMessage(),
            ], 500);
        }
    }

    /**
     * Create or update a contact in HubSpot using the SDK
     */
    private function createOrUpdateHubSpotContact($hubspot, array $data): array
    {
        $email = $data['email'];

        $contactProperties = [
            'email' => $email,
            'firstname' => $data['first_name'],
            'lastname' => $data['last_name'],
            'hs_marketable_status' => 'Marketing Contact',
        ];

        try {
            // Try to find existing contact by email
            $filter = new Filter();
            $filter->setOperator('EQ')
                ->setPropertyName('email')
                ->setValue($email);

            $filterGroup = new FilterGroup();
            $filterGroup->setFilters([$filter]);

            $searchRequest = new PublicObjectSearchRequest();
            $searchRequest->setFilterGroups([$filterGroup]);

            $searchResponse = $hubspot->crm()->contacts()->searchApi()->doSearch($searchRequest);

            if ($searchResponse->getTotal() > 0) {
                // Contact exists, update it
                $contactId = $searchResponse->getResults()[0]->getId();

                $properties = new SimplePublicObjectInput();
                $properties->setProperties($contactProperties);

                $hubspot->crm()->contacts()->basicApi()->update($contactId, $properties);

                return [
                    'success' => true,
                    'contactId' => $contactId,
                ];
            } else {
                // Contact doesn't exist, create it
                $properties = new SimplePublicObjectInputForCreate();
                $properties->setProperties($contactProperties);

                $response = $hubspot->crm()->contacts()->basicApi()->create($properties);

                return [
                    'success' => true,
                    'contactId' => $response->getId(),
                ];
            }
        } catch (ContactsApiException $e) {
            Log::error('HubSpot contact API error: ' . $e->getMessage());
            return [
                'success' => false,
                'message' => $e->getMessage(),
            ];
        }
    }

    /**
     * Add a contact to a HubSpot list (creates list if it doesn't exist)
     * Note: Lists API v3 requires contact IDs for membership operations
     */
    private function addContactToHubSpotList(string $apiKey, string $listName, string $contactId): array
    {
        // Search for existing list by name
        $listsResponse = Http::withHeaders([
            'Authorization' => 'Bearer ' . $apiKey,
            'Content-Type' => 'application/json',
        ])->post('https://api.hubapi.com/crm/v3/lists/search', [
            'name' => $listName,
            'count' => 250,
        ]);

        $listId = null;

        if ($listsResponse->successful()) {
            $lists = $listsResponse->json('lists') ?? [];
            foreach ($lists as $list) {
                if ($list['name'] === $listName) {
                    $listId = $list['listId'];
                    break;
                }
            }
        }

        // If list doesn't exist, create it
        if (!$listId) {
            $createListResponse = Http::withHeaders([
                'Authorization' => 'Bearer ' . $apiKey,
                'Content-Type' => 'application/json',
            ])->post('https://api.hubapi.com/crm/v3/lists', [
                'name' => $listName,
                'objectTypeId' => '0-1',
                'processingType' => 'MANUAL',
            ]);

            if ($createListResponse->successful()) {
                $list = $createListResponse->json('list');
                $listId = $list['listId'];
            } else {
                Log::error('HubSpot create list error: ' . $createListResponse->body());
                return [
                    'success' => false,
                    'message' => 'Failed to create list',
                ];
            }
        }

        // Add contact to list using contact ID
        $addToListResponse = Http::withHeaders([
            'Authorization' => 'Bearer ' . $apiKey,
            'Content-Type' => 'application/json',
        ])->put("https://api.hubapi.com/crm/v3/lists/{$listId}/memberships/add", [
            $contactId
        ]);

        if ($addToListResponse->successful()) {
            return [
                'success' => true,
            ];
        } else {
            Log::error('HubSpot add to list error: ' . $addToListResponse->body());
            return [
                'success' => false,
                'message' => 'Failed to add contact to list',
            ];
        }
    }
}
