<?php

/*
* @copyright Copyright (C) 2005-2010 Keyboard Monkeys Ltd. http://www.kb-m.com
* @license http://creativecommons.org/licenses/BSD/ BSD Licensese
* @author Keyboard Monkeys Ltd.
* @package Monkeys Framework
* @packager Keyboard Monkeys
*/

abstract class Monkeys_Lucene
{
    const LUCENE_DIR = '/lucene';

    private static $_index;

    /**
    * @throws Zend_Search_Lucene_exception
    */
    public static function getIndex()
    {
        if (!@self::$_index) {
            try {
                self::$_index = Zend_Search_Lucene::open(APP_DIR . self::LUCENE_DIR);
            } catch (Zend_Search_Lucene_Exception $e) {
                self::$_index = Zend_Search_Lucene::create(APP_DIR . self::LUCENE_DIR);
                Zend_Registry::get('logger')->log('Created Lucene index file', Zend_Log::INFO);
            }
        }

        return self::$_index;
    }

    public static function optimizeIndex()
    {
        $index = self::getIndex();
        $index->optimize();
    }

    public static function checkPcreUtf8Support()
    {
        if (@preg_match('/\pL/u', 'a') == 1) {
            return true;
        } else {
            return false;
        }
    }

    public static function clearIndex()
    {
        // need to remove the locks, otherwise error under windows
        self::getIndex()->removeReference();
        self::$_index = null;

        self::_rmdirr(APP_DIR . self::LUCENE_DIR);
    }

    /** * Delete a file, or a folder and its contents
    *
    * @author      Aidan Lister <aidan@php.net>
    * @version     1.0.1
    * @param       string   $dirname    Directory to delete
    * @return      bool     Returns TRUE on success, FALSE on failure
    */
    private static function _rmdirr($dirname)
    {
        // Sanity check
        if (!file_exists($dirname)) {
            return false;
        }
        // Simple delete for a file
        if (is_file($dirname)) {
            return unlink($dirname);
        }
        // Loop through the folder
        $dir = dir($dirname);
        while (false !== $entry = $dir->read()) {
            // Skip pointers and dot directories
            if (substr($entry, 0, 1) == '.') {
                continue;
            }
            // Deep delete directories
            if (is_dir("$dirname/$entry")) {
                self::_rmdirr("$dirname/$entry");
            } else {
                unlink("$dirname/$entry");
            }
        }
        // Clean up
        $dir->close();

        return true;
    }
}