<?php /*
 *   $Id$
 *
 *   AbanteCart, Ideal OpenSource Ecommerce Solution
 *   http://www.AbanteCart.com
 *
 *   Copyright © 2011-2025 Belavier Commerce LLC
 *
 *   This source file is subject to Open Software License (OSL 3.0)
 *   License details is bundled with this package in the file LICENSE.txt.
 *   It is also available at this URL:
 *   <http://www.opensource.org/licenses/OSL-3.0>
 *
 *  UPGRADE NOTE:
 *    Do not edit or add to this file if you wish to upgrade AbanteCart to newer
 *    versions in the future. If you wish to customize AbanteCart for your
 *    needs please refer to http://www.AbanteCart.com for more information.
 */

/** @noinspection SqlResolve */

class ControllerResponsesDesignPageLayout extends AController
{
    public $errors = [];

    public function main()
    {
        $this->extensions->hk_InitData($this, __FUNCTION__);

        $this->loadLanguage('design/layout');
        $this->view->batchAssign($this->language->getASet());

        $form = new AForm('ST');
        $form->setForm(['id' => 'pageLayoutFrm']);

        $this->data['form']['form_open'] = $form->getFieldHtml(
            [
                'type'   => 'form',
                'name'   => 'pageLayoutFrm',
                'action' => $this->html->getSecureURL('r/design/page_layout/create'),
                'attr'   => 'data-confirm-exit="true"  class="aform form-horizontal"',
            ]
        );
        $this->data['form']['submit'] = $form->getFieldHtml(
            [
                'type' => 'button',
                'name' => 'submit',
                'text' => $this->language->get('button_insert'),
            ]
        );

        $layout = new ALayoutManager($this->request->get['tmpl_id']);

        $this->data['form']['fields']['template'] = $form->getFieldHtml(
            [
                'type'    => 'selectbox',
                'name'    => 'tmpl_id',
                'options' => $layout->getTemplateList(true),
                'value'   => $this->request->get['tmpl_id'],
                'require' => true
            ]
        );
        $this->data['entry_template'] = $this->language->get('text_select_template');

        $this->data['form']['fields']['page_name'] = $form->getFieldHtml(
            [
                'type'     => 'input',
                'name'     => 'page_name',
                'required' => true
            ]
        );
        $this->data['form']['fields']['page_title'] = $form->getFieldHtml(
            [
                'type' => 'input',
                'name' => 'page_title',
            ]
        );
        $routes = $layout->getExtensionsPageRoutes();
        $options = $disabled_options = [];
        foreach ($routes as $extId => $rts) {
            $options[$extId] = mb_strtoupper($extId);
            $disabled_options[$extId] = $extId;
            foreach ($rts as $rt) {
                $options[$rt] = $rt;
            }
        }
        $this->data['form']['fields']['page_rt'] = $form->getFieldHtml(
            [
                'type'             => 'selectbox',
                'name'             => 'page_rt',
                'options'          => $options,
                'required'         => true,
                'disabled_options' => $disabled_options
            ]
        );

        $this->data['form']['fields']['key_parameter_name'] = $form->getFieldHtml(
            [
                'type'        => 'input',
                'name'        => 'key_parameter_name',
                'value'       => '',
                'placeholder' => 'keep blank to cover all requests to controller'
            ]
        );
        $this->data['form']['fields']['key_parameter_value'] = $form->getFieldHtml(
            [
                'type'  => 'input',
                'name'  => 'key_parameter_value',
                'value' => '',
            ]
        );

        //prepend button to generate keyword
        $this->data['keyword_button'] = $form->getFieldHtml(
            [
                'type'  => 'button',
                'name'  => 'generate_seo_keyword',
                'text'  => $this->language->get('button_generate'),
                //set button not to submit a form
                'attr'  => 'type="button"',
                'style' => 'btn btn-info',
            ]
        );
        $this->data['generate_seo_url'] = $this->html->getSecureURL('common/common/getseokeyword');
        $this->data['form']['fields']['seo_keyword'] = $form->getFieldHtml(
            [
                'type'     => 'input',
                'name'     => 'seo_keyword',
                'value'    => '',
                'help_url' => $this->gen_help_url('seo_keyword'),
            ]
        );

        $pages = $layout->getAllPages();
        $this->data['entry_source_layout_id'] = $this->language->get('text_select_copy_layout');
        $sourceLayouts = array_column($pages, 'layout_name', 'layout_id');

        $this->data['form']['fields']['source_layout_id'] = $form->getFieldHtml(
            [
                'type'    => 'selectbox',
                'name'    => 'source_layout_id',
                'value'   => '',
                'options' => $sourceLayouts,
            ]
        );

        $this->data['redirect_url'] = $this->request->get['redirect_url']
            ? html_entity_decode(urldecode($this->request->get['redirect_url']))
            : $this->html->getSecureURL('design/layout');
        $this->data['modal_title'] = $this->language->get('text_create_new_layout');
        $this->view->batchAssign($this->data);
        $this->data['output'] = $this->view->fetch('responses/design/add_layout.tpl');
        $this->extensions->hk_UpdateData($this, __FUNCTION__);
        $this->response->setOutput($this->data['output']);
    }

    public function create()
    {
        $this->loadLanguage('design/layout');
        $this->extensions->hk_InitData($this, __FUNCTION__);
        if (!$this->request->is_POST()) {
            $err = new AError('Forbidden');
            $err->toJSONResponse('VALIDATION_ERROR_406', ['error_text' => 'Forbidden']);
            return;
        }

        if (!$this->validate($this->request->post)) {
            $err = new AError('Data Validation');
            $err->toJSONResponse(
                'VALIDATION_ERROR_406',
                [
                    'error_text' => current($this->errors),
                    'errors'     => $this->errors
                ]
            );
            return;
        }

        $languageId = $this->language->getContentLanguageID();

        $post = $this->request->post;

        $pageData = [
            'controller'        => $post['page_rt'],
            'key_param'         => $post['key_parameter_name'],
            'key_value'         => $post['key_parameter_value'],
            'page_descriptions' => [
                $languageId => [
                    'name'  => $post['page_name'],
                    'title' => $post['page_title']
                ]
            ]
        ];
        $post['layout_name'] = $post['page_name'];

        $result = saveOrCreateLayout($post['tmpl_id'], $pageData, $post);
        if ($result) {
            $sql = " SELECT p.page_id, l.layout_id
                    FROM " . $this->db->table("pages") . " p " . "
                    INNER JOIN " . $this->db->table("pages_layouts") . " pl 
                        ON pl.page_id = p.page_id
                    INNER JOIN " . $this->db->table("layouts") . " l 
                        ON l.layout_id = pl.layout_id AND l.template_id = '" . $post['tmpl_id'] . "'
                    WHERE p.controller = '" . $post['page_rt'] . "'";
            if ($post['key_parameter_value']) {
                $sql .= " AND p.key_param = '" . $post['key_parameter_name'] . "'";
                $sql .= " AND p.key_value = '" . $post['key_parameter_value'] . "'";
            }
            $result = $this->db->query($sql);
            $this->data['output'] = [
                'layout_id' => $result->row['layout_id'],
                'page_id'   => $result->row['page_id']
            ];
            //add seo-keyword
            if ($post['seo_keyword']) {
                $this->language->replaceDescriptions(
                    'url_aliases',
                    [
                        'query' => "rt=" . $post['page_rt']
                            . ($post['key_parameter_value']
                                ? '&' . $post['key_parameter_name'] . '=' . $post['key_parameter_value']
                                : '')
                    ],
                    [(int)$languageId => ['keyword' => $post['seo_keyword']]]
                );
            }
        } else {
            $err = new AError(AC_ERR_LOAD);
            $err->toJSONResponse(
                'VALIDATION_ERROR_406',
                [
                    'error_text' => 'Cannot save layout',
                ]
            );
            return;
        }

        $this->view->batchAssign($this->data);
        $this->extensions->hk_UpdateData($this, __FUNCTION__);
        $this->load->library('json');
        $this->response->setOutput(AJson::encode($this->data['output']));
    }

    protected function validate(array $inData)
    {
        $this->errors = [];
        if (!$inData['tmpl_id']) {
            $this->errors['tmpl_id'] = $this->language->get('error_template');
        }
        if (!$inData['page_name']) {
            $this->errors['page_name'] = $this->language->get('error_page_name');
        } else {
            $sql = "SELECT * 
                    FROM " . $this->db->table('page_descriptions') . " 
                    WHERE name = '" . $this->db->escape($inData['page_name']) . "'";
            $result = $this->db->query($sql);
            if ($result->num_rows) {
                $this->errors['page_name'] = sprintf($this->language->get('error_page_exists'), $inData['page_name']);
            }
        }
        if (!$inData['page_rt']) {
            $this->errors['page_rt'] = $this->language->get('error_page_rt');
        }
        if (
            (!$inData['key_parameter_name'] && $inData['key_parameter_value'])
            ||
            ($inData['key_parameter_name'] && !$inData['key_parameter_value'])
        ) {
            if (!$inData['key_parameter_name']) {
                $this->errors['key_parameter_name'] = $this->language->get('error_key_parameter_name');
            }
            if (!$inData['key_parameter_value']) {
                $this->errors['key_parameter_value'] = $this->language->get('error_key_parameter_value');
            }
        }

        if ($inData['seo_keyword'] && $this->html->isSEOKeywordExists('', $inData['seo_keyword'])) {
            $this->errors['seo_keyword'] = sprintf($this->language->get('error_seo_keyword'), $inData['seo_keyword']);
        }

        //check if page already exists
        if (!$this->errors) {
            $sql = "SELECT * FROM " . $this->db->table('pages') . " p
                    INNER JOIN " . $this->db->table('pages_layouts') . " pl
                        ON p.page_id = pl.page_id
                    INNER JOIN " . $this->db->table('layouts') . " l
                        ON (l.layout_id = pl.layout_id AND l.template_id = '" . $inData['tmpl_id'] . "')
                    WHERE p.controller = '" . $this->db->escape($inData['page_rt']) . "'";
            if ($inData['key_parameter_name'] && $inData['key_parameter_value']) {
                $sql .= " AND p.key_param='" . $this->db->escape($inData['key_parameter_name']) . "' "
                    . " AND p.key_value='" . $this->db->escape($inData['key_parameter_value']) . "'";
            }
            $result = $this->db->query($sql);
            if ($result->num_rows) {
                $this->errors['page_rt'] = $this->language->get('error_page_parameters');
            }
        }
        return !($this->errors);
    }
}