<?php

/** ******************************************
 * LiteSpeed Web Server Cache Manager
 *
 * @author    Michael Alegre
 * @copyright 2018-2025  LiteSpeed Technologies, Inc.
 * ******************************************* */

namespace Lsc\Wp\Context;

class ContextOption
{

    const FROM_CONTROL_PANEL = 'panel';
    const FROM_CLI           = 'cli';
    const LOG_FILE_NAME = 'webcachemgr.log';
    const IS_NOT_ROOT         = 0;

    /**
     * IS_ROOT_ESCALATABLE depends on panel implemented escalation.
     */
    const IS_ROOT_ESCALATABLE = 1;
    const IS_ROOT             = 2;

    /**
     * @var string
     */
    protected $invokerName;

    /**
     * @var string
     */
    protected $invokerType;

    /**
     * @var int
     */
    protected $isRoot;

    /**
     * @var int
     */
    protected $expectedPermissions;

    /**
     * @var string  Logger class name used during initialization. Child classes
     *              that need escalation should override this class name.
     */
    protected $loggerClass;

    /**
     * @var string  If set, must be writable.
     */
    protected $logFile;

    /**
     * @var int  Log to file level.
     */
    protected $logFileLvl;

    /**
     * @var int  Echo to user interface level.
     */
    protected $logEchoLvl;

    /**
     * @var bool
     */
    protected $bufferedWrite;

    /**
     * @var bool
     */
    protected $bufferedEcho;

    /**
     * @var string  PluginVersion class name used during initialization. Child
     *              classes that need escalation should override this class
     *              name.
     */
    protected $lscwpVerClass;

    /**
     * @var int
     */
    protected $scanDepth = 2;

    /**
     * @var int
     */
    protected $batchTimeout = 0;

    /**
     * @var int
     */
    protected $batchSize = 0;

    /**
     * @var string
     */
    protected $iconDir = '';

    /**
     * @var string
     */
    protected $sharedTplDir = '';

    /**
     *
     * @param string $invokerName
     * @param string $invokerType
     * @param int    $isRoot
     * @param int    $logFileLvl
     * @param int    $logEchoLvl
     * @param bool   $bufferedWrite
     * @param bool   $bufferedEcho
     */
    protected function __construct(
        $invokerName,
        $invokerType,
        $isRoot,
        $logFileLvl,
        $logEchoLvl,
        $bufferedWrite,
        $bufferedEcho
    )
    {
        $this->invokerName = $invokerName;
        $this->invokerType = $invokerType;
        $this->isRoot = $isRoot;
        $this->expectedPermissions = self::IS_ROOT;

        if ( $isRoot == self::IS_ROOT ) {
            $this->logFile = realpath(__DIR__ . '/../../../..') . '/logs/'
                    . self::LOG_FILE_NAME;
        }

        $this->loggerClass = '\Lsc\Wp\Logger';
        $this->lscwpVerClass ='\Lsc\Wp\PluginVersion';
        $this->logFileLvl = $logFileLvl;
        $this->logEchoLvl = $logEchoLvl;
        $this->bufferedWrite = $bufferedWrite;
        $this->bufferedEcho = $bufferedEcho;
    }

    /**
     *
     * @return int
     */
    public function isRoot()
    {
        return $this->isRoot;
    }

    /**
     *
     * @return int
     */
    public function getExpectedPermissions()
    {
        return $this->expectedPermissions;
    }

    /**
     *
     * @return string
     */
    public function getLoggerClass()
    {
        return $this->loggerClass;
    }

    /**
     * Returns the default log file path for this ContextOption. This can be
     * changed in the Logger class itself later on.
     *
     * @return string
     */
    public function getDefaultLogFile()
    {
        return $this->logFile;
    }

    /**
     *
     * @return int
     */
    public function getLogFileLvl()
    {
        return $this->logFileLvl;
    }

    /**
     *
     * @return int
     */
    public function getLogEchoLvl()
    {
        return $this->logEchoLvl;
    }

    /**
     *
     * @return bool
     */
    public function isBufferedWrite()
    {
        return $this->bufferedWrite;
    }

    /**
     *
     * @return bool
     */
    public function isBufferedEcho()
    {
        return $this->bufferedEcho;
    }

    /**
     *
     * @return string
     */
    public function getLscwpVerClass()
    {
        return $this->lscwpVerClass;
    }

    /**
     *
     * @return int
     */
    public function getScanDepth()
    {
        return $this->scanDepth;
    }

    /**
     *
     * @return string
     */
    public function getInvokerType()
    {
        return $this->invokerType;
    }

    /**
     *
     * @return string
     */
    public function getInvokerName()
    {
        return $this->invokerName;
    }

    /**
     *
     * @return int
     */
    public function getBatchSize()
    {
        return $this->batchSize;
    }

    /**
     *
     * @return int
     */
    public function getBatchTimeout()
    {
        return $this->batchTimeout;
    }

    /**
     *
     * @param int $timeout
     *
     * @return int
     */
    public function setBatchTimeout( $timeout )
    {
        if ( is_int($timeout) ) {
            $this->batchTimeout = $timeout;
        }

        return $this->batchTimeout;
    }

    /**
     *
     * @param string $iconDir
     */
    public function setIconDir( $iconDir )
    {
        $this->iconDir = $iconDir;
    }

    /**
     *
     * @return string
     */
    public function getIconDir()
    {
        return $this->iconDir;
    }

    /**
     *
     * @return string
     */
    public function getSharedTplDir()
    {
        return $this->sharedTplDir;
    }

}
