<?php

$cms['modules']['template.mod.php'] = array(
    'name'        => __('Template', 'template.mod.php'),
    'description' => __('Module for switch templates and configure template settings', 'template.mod.php'),
    'url_title'   => __('Module page'),
    'url_link'    => __('https://coffee-cms.com/en/modules/template/', 'template.mod.php'),
    'author'      => __('Coffee CMS team'),
    'version'     => '21.06',
    'files'       => array(
        '.cms/mod/template.mod.php',
        '.cms/js/template.js',
        '.cms/lang/ru_RU.UTF-8/template.mod.php',
    ),
    'sort'        => 20,
);

// Return if module disabled
if ( isset($cms['config']['template.mod.php']['disabled'])
&& $cms['config']['template.mod.php']['disabled'] === true ) return;


// Install
if (empty($cms['config']['template.mod.php']['template'])) {
    $cms['config']['template.mod.php']['template'] = 'mini';
}
if (empty($cms['config']['template.mod.php']['scripts'])) {
    $cms['config']['template.mod.php']['scripts'] = '';
}

$cms['template'] = $cms['config']['template.mod.php']['template'];

if ( is_admin() ) {
    cms_add_function('admin', 'cms_template_admin');
    cms_add_function('api', 'cms_template_api');
}
cms_add_function('template', 'cms_template_template');
cms_add_function('echo', 'cms_template_echo');
cms_add_function('write', 'cms_template_write');

function cms_template_admin() {
    global $cms;
    if (!is_admin()) return;
    // Save settings
    if ( !empty( $_POST['save_template'] ) ) {
        cms_clear_cache();
        $cms['config']['template.mod.php']['template'] = $_POST['template'];
        cms_save_config();
        header('Location: ' . $cms["config"]["admin.mod.php"]["admin_url"]);
        exit;
    }
    if ( !empty( $_POST['save_template_scripts'] ) ) {
        cms_clear_cache();
        $cms['config']['template.mod.php']['scripts'] = $_POST['scripts'];
        cms_save_config();
        header('Location: ' . $cms["config"]["admin.mod.php"]["admin_url"]);
        exit;
    }

    // Создаем пункт меню, если еще не создан
    if ( empty( $cms['config']['template.mod.php']['menu']['template'] ) ) {
        $cms['config']['template.mod.php']['menu']['template'] = array(
            'title'    => 'Template',
            'sort'     => 70,
            'class'    => '',
            'section'  => 'Settings',
        );
        cms_save_config();
    }
    
    // Display settings
    $page = '
    <div class="main-header"></div>
    <div class="main-main">
    <div class=db-grid> <div class=dbbox>
    <form method=post><div class=field-name-bd>'.__("Current Template", 'template.mod.php').'</div><div class="field select2-wrapper"><select name=template class=settingx>';
    foreach( glob($cms['cms_dir'].'/*/html.php') as $index ) {
        $template = preg_replace('/.*\/([^\/]+)\/html\.php/', '$1', $index);
        if ( ! preg_match( '/^admin/', $template ) ) {
            if ($template === $cms['config']['template.mod.php']['template']) {
                $selected = 'selected';
            } else {
                $selected = '';
            }
            $page .= "<option value=$template $selected>$template</option>";
        }
    }
    $page .= '</select></div>';
    $page .= '<button name=save_template value=1 class=button-save>'.__('Save', 'template.mod.php').'</button></form>';
    $page .= '</div> <div class=dbmanual>
    <div class=info>
        <h1>'.__('Help', 'template.mod.php').'</h1>
        <p>'.__('You can create your own theme or choose from existing ones. All instructions on <a href="https://coffee-cms.com/doc/templates/" target=_blank>the site</a>.', 'template.mod.php').'</p>
    </div>
    </div> </div>
    </div>
    <div class="main-footer"></div>';
    /*
    $settings = $cms['cms_dir'].'/'.$cms['config']['template.mod.php']['template'].'/settings.php';
    //chdir($cms['cms_dir'].'/'.$cms['config']['template.mod.php']['template']);
    ob_start();
    if ( file_exists( $settings ) ) {
        include( $settings );
        //file_put_contents($cms['site_dir'].'/template.txt', var_export(true, true), FILE_APPEND);
    }
    $ts = ob_get_clean();
    //file_put_contents($cms['site_dir'].'/template.txt', var_export($ts, true), FILE_APPEND);
    */
    $cms['admin_pages']['template'] = $page;

    // Создаем пункт меню, если еще не создан
    if ( empty( $cms['config']['template.mod.php']['menu']['counters'] ) ) {
        $cms['config']['template.mod.php']['menu']['counters'] = array(
            'title'    => 'Counters',
            'sort'     => 80,
            'class'    => '',
            'section'  => 'Settings',
        );
        cms_save_config();
    }

    $page = '<div class="main-header"></div><div class="main-main"><div class=customcode><form method=post><h1>'.__('Scripts and styles in footer', 'template.mod.php').'</h1><div class="field"><textarea name=scripts class=style-textarea-customcode rows=15>'.htmlspecialchars($cms['config']['template.mod.php']['scripts']).'</textarea></div> <button name=save_template_scripts value=1 class=button-save>'.__('Save', 'template.mod.php').'</button></form></div></div><div class="main-footer"></div>';
    $cms['admin_pages']['counters'] = $page;

}

// Load template settings
function cms_template_api() {
    global $cms;
    if (!is_admin()) return;
    $settings = $cms['cms_dir'].'/'.$cms['config']['template.mod.php']['template'].'/settings.php';
    if ( file_exists( $settings ) ) { include( $settings ); }
}


function cms_template_template() {
    global $cms;
    if ( file_exists($cms['cms_file']) && 
         is_file($cms['cms_file']) && 
         substr($cms['cms_file'], -4, 4) !== '.php' &&
         strpos(str_replace($cms['cms_dir'],'',$cms['cms_file']), '/.') === false ) {
        $cms['output']['from'] = $cms['cms_file'];
        $cms['output']['to']   = $cms['site_dir'].$cms['url']['path'];
        $cms['status']         = '200';
    } else {
        ob_start();
        include($cms['cms_dir'].'/'.$cms['template'].'/html.php');
        $cms['output'] = ob_get_clean();
    }
}


function cms_template_echo() {
    global $cms;
    if (is_array($cms['output'])) {
        # Только админу доступны файлы из внутренностей CMS
        /*if ( $cms['template'] !== preg_replace( '|/.*|', '', $cms['output']['to'] ) && !is_admin() ) {
            header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
            return;
        }*/
        # Убрать предупреждения в google chrome
        $types = array(
            'css' => 'text/css',
            'js' => 'application/javascript',
            'svg' => 'image/svg+xml',
        );
        $ext = preg_replace('/.*\./', '', $cms['output']['to']);
        if (isset($types[$ext])) {
            $mime = $types[$ext];
        } else {
            $mime = '';
        }
        header('Content-Type: '.$mime);
        header($_SERVER["SERVER_PROTOCOL"]." 200 OK"); // fix server 404
        readfile($cms['output']['from']);
    } elseif ($cms['status'] === '200') {
        header($_SERVER["SERVER_PROTOCOL"]." 200 OK"); // fix server 404
        echo $cms['output'];
    } elseif (is_admin()) {
        header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
        echo $cms['output'];
    } else {
        header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
        echo $cms['output']; // fix empty page
        //echo "empty";
    }
}


function cms_template_write() {
    global $cms;
    if ($cms['status'] === '404') return;
    # Запись на диск
    umask(0);
    if (is_array($cms['output'])) {
        # Файлы админки не кешируем
        if ( '/admin/' === preg_replace( '|/admin/.*|', '/admin/', $cms['url']['path'] ) ) return;
        
        # Создаем директорию, если отсутствует
        $dir = dirname($cms['output']['to']);
        if (!file_exists($dir)) {
            mkdir($dir, 0777, true);
        }
        copy($cms['output']['from'],$cms['output']['to']);
    } else {
        $file = $cms['site_dir'].$cms['url']['path'];
        if (substr($file,-1)==='/') $file .= 'index.html';
        $dir = dirname($file);
        if (!file_exists($dir)) {
            mkdir($dir, 0777, true);
        }
        file_put_contents($file, $cms['output']);
        chmod($file, 0666);
        // delete parent
        if (!empty($cms['page']['parent'])) {
            $file = $cms['site_dir'].$cms['page']['parent']['url'];
            if (substr($file,-1)==='/') $file .= 'index.html';
            if (is_file($file)) { unlink($file); }
        }
    }
}


# Очищаем кеш диска
function cms_clear_cache() {
    global $cms;

    # Подключаемся к БД
    if ( empty( $cms['base'] ) ) {
        cms_base_connect();
    }

    # В этом массиве очередь сканируемых папок
    $queue[] = $cms['cms_dir'];

    # Здесь собираем папки для последующего удаления
    $dirs = array();

    # Находим все страницы и удаляем
    if ( ! empty( $cms['base'] ) ) {
        if ( $res = mysqli_query( $cms['base'], "SELECT url FROM pages" ) ) {
            while ( $page = mysqli_fetch_assoc( $res ) ) {
                $file = $cms['site_dir'] . $page['url'];
                if ( substr( $file, -1 ) === '/' ) {
                    $dirs[] = $file;
                    $file  .= 'index.html';
                }
                if ( is_file( $file ) ) unlink( $file );
            }
        }
    }

    # Удаляем файлы шаблонов
    while ( $cur = array_shift( $queue ) ) {
        if ( is_dir( $cur ) ) {
            # Добавляем текущую папку в очередь на удаление, вырезав .cms/
            array_unshift( $dirs, str_replace( '.cms/', '', $cur ) );
            # Добавляем к очереди все найденные вложенные папки и файлы
            $queue = array_merge( $queue, glob( $cur . "/*" ) );
        } else {
            # У файлов убираем .cms/
            $file = str_replace( '.cms/', '', $cur );
            # Если файл существует, то удаляем
            if ( is_file( $file ) ) unlink( $file );
        }
    }

    # Удаляем папки
    # Сортируем чтобы самые длинные пути оказались впереди
    rsort( $dirs );
    foreach ( $dirs as $dir ) {
        # Зачем-то вырезаем /$ и \$
    	$dir = preg_replace( "/\/$|\\$/", "", $dir );
        # Удаляем папку если это не папка с ядром CMS и если это не папка сайта
        if ( is_dir( $dir ) && $dir !== $cms['cms_dir'] && $dir !== $cms['site_dir'] ) {
            @rmdir( $dir );
        }
    }
}


# Создаем кеш диска
# дает 404 после обновления cms
function cms_create_cache() {
    global $cms;

    # Подключаемся к БД
    if ( empty( $cms['base'] ) ) {
        cms_base_connect();
    }

    # В этом массиве очередь сканируемых папок
    $queue[] = $cms['cms_dir'];

    # Добавляем файлы шаблонов
    /*
    while ( $cur = array_shift( $queue ) ) {
        if ( is_dir( $cur ) ) {
            # Добавляем к очереди все найденные вложенные папки и файлы
            $queue = array_merge( $queue, glob( $cur . "/*" ) );
        } else {
            # Получаем адрес нового файла вырезая .cms/
            $file = str_replace( '.cms/', '', $cur );
            # Если файл не существует и не является php-файлом, то создаем
            if ( substr( $file, -4 ) !== '.php' && !file_exists( $file ) ) {
                
                # Создаем директорию, если отсутствует
                $dir = dirname( $file );
                if ( !file_exists( $dir ) ) {
                    mkdir( $dir, 0777, true );
                }

                # Копируем туда файл
                copy( $cur, $file );
            }
        }
    }
    */

    # Отключить стандартную функцию шаблонизации
    $cms['stages']['template'][10]['cms_template'] = false;
    $cms['stages']['template']['next'] = '';

    # Добавляем страницы
    if ( ! empty( $cms['base'] ) ) {
        $created = date('Y-m-d H:i:s');
        $q = "SELECT * FROM pages WHERE created<='{$created}'";
        if ( $res_list = mysqli_query( $cms['base'], $q ) ) {
            while ( $cms['page'] = mysqli_fetch_assoc( $res_list ) ) {
                # Предохранитель от варнингов
                if ( empty( $cms['page']['url'] ) ) continue;

                # Информация о родительской
                if ( $res_parent = mysqli_query( $cms['base'], "SELECT * FROM pages WHERE nid={$cms['page']['pid']}") ) {
                    if ( $parent = mysqli_fetch_assoc($res_parent) ) {
                        $cms['page']['parent'] = $parent;
                    }
                }

                $file = $cms['site_dir'] . $cms['page']['url'];
                if ( substr( $file, -1 ) === '/' ) {
                    $file  .= 'index.html';
                }
                
                # Создаем страницу по шаблону
                ob_start();
                include( $cms['cms_dir'] . '/' . $cms['config']['template.mod.php']['template'] . '/html.php' );
                $cms['output'] = ob_get_clean();
                
                
                cms_do_stage('template');
                
                # Создаем директорию, если отсутствует
                $dir = dirname( $file );
                if ( !file_exists( $dir ) ) {
                    mkdir( $dir, 0777, true );
                }
                
                # Создаем файл
                file_put_contents( $file, $cms['output'] );
            }
        }
    }

}