<?php
/**
 * SeekQuarry/Yioop --
 * Open Source Pure PHP Search Engine, Crawler, and Indexer
 *
 * Copyright (C) 2009 - 2026  Chris Pollett chris@pollett.org
 *
 * LICENSE:
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *
 * END LICENSE
 *
 * @author Eswara Rajesh Pinapala epinapala@live.com
 * @license https://www.gnu.org/licenses/ GPL3
 * @link https://www.seekquarry.com/
 * @copyright 2009 - 2026
 * @filesource
 */
namespace seekquarry\yioop\views;

use seekquarry\yioop\configs as C;


/**
 * View used to draw and allow editing of wiki page when not in the admin view
 * (so activities panel on side is not present.) This is also used to draw
 * wiki pages for public groups when not logged.
 *
 * @author Eswara Rajesh Pinapala
 */
class ApiView extends View
{
    /** This view is drawn on a web layout
     * @var string
     */
    public $layout = "api";
    /**
     * Draws a minimal container with a WikiElement in it on which a group
     * wiki page can be drawn. For continuous scroll search gives a minimal
     * containing for scrolled-to search results
     *
     * @param array $data with fields used for drawing the container and page
     */
    public function renderView($data)
    {
        $controller = $this->controller_object;
        /* Names offered while somebody is typing go back as data rather
           than as a page, since the screen that asked puts them into a
           list of its own. An answer holding no names is still an answer:
           it tells the screen to offer nothing. */
        if (isset($data['SUGGESTIONS'])) {
            $controller->web_site->header("Content-Type: application/json");
            e(json_encode(["suggestions" => $data['SUGGESTIONS']]));
            return;
        }
        /* A further page of a scrolled issue list, and one place of a
           front page asked for on its own, are each answered with that
           part alone, which the wiki element draws; neither is the group
           feed a wiki page's own scrolling asks for. */
        if (!empty($data['GIT_ISSUE_ROWS_ONLY']) ||
            isset($data['FRONT_PAGE_PLACE'])) {
            $data['API'] = true;
            $this->element("wiki")->render($data);
            return;
        }
        if (!empty($data['ELEMENT']) &&
            (empty($data['MODE']) || $data['MODE'] != 'api')) {
            switch ($data['ELEMENT'])
            {
                case 'search':
                    $data['API'] = true;
                    $this->element("search")->render($data);
                    break;
                case 'wiki':
                case 'groupfeed':
                    $data['API'] = true;
                    $this->element("groupfeed")->render($data);
                    break;
                case 'summarize':
                    $data['API'] = true;
                    $this->element("api")->render($data);
                    break;
                case 'usermessages':
                    $data['API'] = true;
                    $controller->web_site->header("X-Accel-Buffering: no");
                    $controller->web_site->header(
                        "Content-Type: text/event-stream");
                    $controller->web_site->header("Cache-Control: no-cache");
                    if (empty($data['EVENT_TYPE'])) {
                        $output = ['type' => 'status'];
                        ob_start();
                        $this->element("usermessages")->render($data);
                        $output['data'] = ob_get_contents();
                        ob_end_clean();
                        e("data: ". json_encode($output) . PHP_EOL);
                        e('retry: ' . C\USER_MESSAGE_STATUS_POLL_TIME .
                            PHP_EOL . PHP_EOL);
                    }
                    break;
            }
        } else {
            $this->element("api")->render($data);
        }
    }
}
