<?php
/**
 * Magento 2 Google Analytics 4 (GA4) GTM
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Anowave license that is
 * available through the world-wide-web at this URL:
 * https://www.anowave.com/license-agreement/
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade this extension to newer
 * version in the future.
 *
 * @category 	Anowave
 * @package 	Anowave_Ec
 * @copyright 	Copyright (c) 2026 Anowave (https://www.anowave.com/)
 * @license  	https://www.anowave.com/license-agreement/
 */

namespace Anowave\Ec\Controller\Index;

use Magento\Framework\Controller\Result\JsonFactory;

use Magento\Framework\App\ActionInterface;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\Controller\Result\Json;
use Anowave\Ec\Helper\Data;
use Anowave\Ec\Model\Logger;
use Magento\Framework\Data\Form\FormKey\Validator;

abstract class Capi implements ActionInterface
{
    const REQUEST_TYPE_XML = 'XMLHttpRequest';

    /**
     * Request
     */
    protected RequestInterface $requestInterface;

    /**
     * Response type
     */
    protected JsonFactory $resultJsonFactory;

    /**
     * Helper
     */
    protected Data $helper;

    /**
     * Logger
     */
    protected Logger $logger;

    protected Validator $validator;

    /**
     * Constructor
     */
    public function __construct
    (
        RequestInterface $requestInterface,
        JsonFactory $resultFactory,
        Data $helper,
        Logger $logger,
        Validator $validator
    )
    {
        $this->requestInterface = $requestInterface;
        $this->resultJsonFactory = $resultFactory;
        $this->helper = $helper;
        $this->logger = $logger;
        $this->validator = $validator;
    }

    /**
     * Get request 
     * 
     * @return RequestInterface
     */
    public function getRequest() : RequestInterface
    {
        return $this->requestInterface;
    }

    /**
     * Execute controller
     */
    public function execute() : Json
    {
        $assert = $this->assertRequest();

        if (!$assert)
        {
            $response = $this->handle();
        }
        else 
        {
            $response = 
            [
                'errors' => $assert
            ];
        }
    
        return $this->resultJsonFactory->create()->setData($response);
    }

    /**
     * Assert request 
     * 
     * @return array
     */
    private function assertRequest() : array 
    {
        $assert = [];

        $request = $_SERVER['HTTP_X_REQUESTED_WITH'] ?? null;

        if (static::REQUEST_TYPE_XML !== $request)
        {
            $assert[] = __('Invalid request');
        }

        if (!$this->validator->validate($this->getRequest())) 
        {
            $assert[] = __('Invalid form key');
        }

        return $assert;

    }

    /**
     * Handle request
     * 
     * @return array
     */
    abstract public function handle() : array;
}