<?php

namespace Hura8\Components\Template\AdminController;

use Hura8\Components\Template\Controller\TemplateController;
use Hura8\Components\Template\Model\TemplateModel;


class ATemplateController extends TemplateController
{

    /* @var  TemplateModel $objTemplateModel */
    protected  $objTemplateModel;

    protected $template_set = '';

    public function __construct($template_set='default') {
        parent::__construct($template_set);
        $this->objTemplateModel = new TemplateModel($template_set);
        $this->template_set = $template_set;

        $this->checkAndCreateDirectory();
    }

    public function checkFileExist($file_name, $f_type ) {
        return $this->objTemplateModel->checkFileExist($file_name, $f_type);
    }

    public function getInfo($id) {
        return $this->objTemplateModel->getInfo($id);
    }

    public function getEmptyInfo($addition_field_value = []) {
        return $this->objTemplateModel->getEmptyInfo($addition_field_value);
    }

    public function getModuleList() {
        return $this->objTemplateModel->getModuleList();
    }


    /**
     * @description full tpl file name has this format: language_layout_base-name
     * language is omitted if language = 'vnd'
     * layout is omitted if layout = 'pc'
    Example:
     * for vn/pc:
    - index
    - product_detail
     * for vn/mobile:
    - mobile_index
    - mobile_product_detail
     * for en/pc:
    - en_index
    - en_product_detail
     * for en/mobile:
    - en_mobile_index
    - en_mobile_product_detail
     * @description contruct a full tpl file name to store in folder filesystem
     * @param string $language vn or en
     * @param string $layout pc or mobile
     * @param string $base_name should not contain reserved keywords used for language (i.e en) & layout (i.e mobile)
     * @return string
     * @test
    debug_var(\Hura8\Admin\ATemplate::buildFullTplFileName("product_detail", "vn", "pc"));
    debug_var(\Hura8\Admin\ATemplate::buildFullTplFileName("product_detail", "vn", "mobile"));
    debug_var(\Hura8\Admin\ATemplate::buildFullTplFileName("product_detail", "en", "pc"));
    debug_var(\Hura8\Admin\ATemplate::buildFullTplFileName("product_detail", "en", "mobile"));
     */
    public static function buildFullTplFileName(string $base_name, string $language=DEFAULT_LANGUAGE, string $layout='pc') {
        if($language == DEFAULT_LANGUAGE) {
            return ($layout == 'pc') ? $base_name : join("_", [$layout, $base_name]);
        }

        return ($layout == 'pc') ? join("_", [$language, $base_name]) : join("_", [$language, $layout, $base_name]);
    }

    /**
     * @description extract $language, $layout, $base_name from $full_tpl_file
     * @param string $full_tpl_file
     * @return array
     * @test
    debug_var(\Hura8\Admin\ATemplate::extractFullTplFileName("product_detail"));
    debug_var(\Hura8\Admin\ATemplate::extractFullTplFileName("mobile_product_detail"));
    debug_var(\Hura8\Admin\ATemplate::extractFullTplFileName("en_product_detail"));
    debug_var(\Hura8\Admin\ATemplate::extractFullTplFileName("en_mobile_product_detail"));
     */
    public static function extractFullTplFileName(string $full_tpl_file) {
        $language = DEFAULT_LANGUAGE;
        $layout = "pc";

        // check for different language
        if(substr($full_tpl_file, 0, 3) == "en_") {
            $language = "en";
        }

        // check for different layout
        $clean_file = str_replace($language."_", "", $full_tpl_file);
        if(substr($clean_file, 0, 7) == "mobile_") {
            $layout = "mobile";
        }

        $base_name = str_replace($layout."_", "", $clean_file);

        return [ $language, $layout, $base_name ];
    }

    protected function checkAndCreateDirectory() {
        // check and create directory
        if (!is_dir($this->web_template_path)) {
            mkdir($this->web_template_path, 0755, true);
        }

        if (!is_dir($this->assets_template_path)) {
            mkdir($this->assets_template_path, 0755, true);
            mkdir(join(DIRECTORY_SEPARATOR, [$this->assets_template_path, 'script']), 0755, true);
            mkdir(join(DIRECTORY_SEPARATOR, [$this->assets_template_path, 'images']), 0755, true);
        }
    }

    public function getFiles(array $conditions = []) {

        $conditions['numPerPage'] = 2000;

        return $this->objTemplateModel->getList($conditions);
    }


    public function getVersionHistory($module, $tpl_file) {
        return $this->objTemplateModel->getVersionHistory($module, $tpl_file);
    }

    public function getVersionContent($module, $tpl_file, $version) {
        return $this->objTemplateModel->getVersionContent($module, $tpl_file, $version);

    }

    public function getFileContent($tpl_file, $folder, $is_setting = false) {
        $ext = strrchr($tpl_file, ".");
        if ($ext) $tpl_file = str_replace($ext, "", $tpl_file);

        switch ($ext) {
            // css or js files
            case ".script":
                $full_file_path = join(DIRECTORY_SEPARATOR, [$this->assets_template_path, "script", $tpl_file]);
                $content = (@file_exists($full_file_path)) ? @file_get_contents($full_file_path) : '<!--Chưa có file '.$tpl_file.'. Nhấn lưu lại để tạo-->';
                $real_ext = strrchr($tpl_file, ".");
                $editor_mode = ($real_ext == ".js") ? 'text/javascript' : 'text/css';

                return "<div style='padding-left:20px; padding-right:20px'>
                        <textarea style='width:100%; height:600px; padding:3px' id='tpl_editor'>" . htmlspecialchars($content) . "</textarea>
                        <script>
                              var CodeMirror_editor = CodeMirror.fromTextArea(document.getElementById(\"tpl_editor\"), {
                                mode: \"".$editor_mode."\",
                                lineNumbers: true, 
                                lineWrapping : true,
                                matchBrackets: true,
                                continueComments: \"Enter\",
                                extraKeys: {
                                    \"F11\": function(cm) {
                                      cm.setOption(\"fullScreen\", !cm.getOption(\"fullScreen\"));
                                    },
                                    \"Esc\": function(cm) {
                                      if (cm.getOption(\"fullScreen\")) cm.setOption(\"fullScreen\", false);
                                    }
                                 }
                              });
                       </script>
                        </div>
                 ";


            case ".image":

                $full_file_path = join(DIRECTORY_SEPARATOR, [$this->assets_template_path, "images", $tpl_file]);
                return "<div style='padding-left:20px; padding-right:20px; max-width:600px; overflow:auto'>
							 <img src='" . $full_file_path . "' alt='' /> 
						  </div>";


            default;

                $full_file_path = ($folder != 'index') ?
                    join(DIRECTORY_SEPARATOR, [$this->web_template_path, $folder, $tpl_file.".html"]) :
                    join(DIRECTORY_SEPARATOR, [$this->web_template_path, $tpl_file.".html"]) ;

                $content = (@file_exists($full_file_path)) ? @file_get_contents($full_file_path) : '<!--Chưa có file '.$tpl_file.'. Nhấn lưu lại để tạo-->';

                return "
						<style type=\"text/css\">.CodeMirror {border: 1px solid #eee;}</style>
                          <div style='padding-left:20px; padding-right:20px'>
                            <textarea style='width:100%; height:600px; padding:3px' id='tpl_editor' name='tpl_editor'>" . htmlspecialchars($content) . "</textarea>
                          </div>
                          <script>
                              var CodeMirror_editor = CodeMirror.fromTextArea(document.getElementById(\"tpl_editor\"), {
                                mode: \"text/html\",
                                lineNumbers: true, 
                                lineWrapping : true,
                                matchBrackets: true,
                                continueComments: \"Enter\",
                                extraKeys: {
                                    \"F11\": function(cm) {
                                      cm.setOption(\"fullScreen\", !cm.getOption(\"fullScreen\"));
                                    },
                                    \"Esc\": function(cm) {
                                      if (cm.getOption(\"fullScreen\")) cm.setOption(\"fullScreen\", false);
                                    }
                                 }
                              });
                          </script>
					";

        }
    }

}
