<?php
namespace Autogedal\CmsRestDisable\Model;

use Magento\Cms\Api\Data\PageInterface;
use Magento\Cms\Api\Data\PageSearchResultsInterface;
use Magento\Cms\Api\PageRepositoryInterface;
use Magento\Framework\Api\SearchCriteriaInterface;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Webapi\Rest\Request;

class PageRepository implements PageRepositoryInterface
{
    /**
     * @var PageRepositoryInterface
     */
    private $pageRepository;

    /**
     * @var Request
     */
    private $request;

    /**
     * @param PageRepositoryInterface $pageRepository
     * @param Request $request
     */
    public function __construct(
        \Magento\Cms\Model\PageRepository $pageRepository,
        Request $request
    ) {
        $this->pageRepository = $pageRepository;
        $this->request = $request;
    }

    /**
     * @inheritdoc
     */
    public function save(PageInterface $page)
    {
        if ($this->isApiRequest()) {
            throw new LocalizedException(__('The CMS page save operation has been disabled via API.'));
        }
        return $this->pageRepository->save($page);
    }

    /**
     * @inheritdoc
     */
    public function getById($pageId)
    {
        return $this->pageRepository->getById($pageId);
    }

    /**
     * @inheritdoc
     */
    public function getList(SearchCriteriaInterface $searchCriteria)
    {
        return $this->pageRepository->getList($searchCriteria);
    }

    /**
     * @inheritdoc
     */
    public function delete(PageInterface $page)
    {
        if ($this->isApiRequest()) {
            throw new LocalizedException(__('The CMS page delete operation has been disabled via API.'));
        }
        return $this->pageRepository->delete($page);
    }

    /**
     * @inheritdoc
     */
    public function deleteById($pageId)
    {
        if ($this->isApiRequest()) {
            throw new LocalizedException(__('The CMS page delete operation has been disabled via API.'));
        }
        return $this->pageRepository->deleteById($pageId);
    }

    /**
     * Check if the request is coming from the API
     *
     * @return bool
     */
    private function isApiRequest()
    {
        return $this->request->getRequestUri() && strpos($this->request->getRequestUri(), '/rest/') === 0;
    }
}
