<?php

namespace Module\Vendor\Log;


use Illuminate\Support\Facades\Log;
use ModStart\Core\Util\SerializeUtil;

class Logger
{
    private static function rotateLogPath($filename, $logType, $base)
    {
        $date = date('Ymd');
        return rtrim($base, '/') . '/' . $filename . ($logType ? '_' . $logType : '') . '_' . $date . '.log';
    }

    private static function rotateLogPattern($filename, $logType, $base)
    {
        return rtrim($base, '/') . '/' . $filename . ($logType ? '_' . $logType : '') . '_[0-9][0-9][0-9][0-9]*.log';
    }

    private static function rotateLogClean($filename, $logType, $maxKeeps, $base)
    {
        $pattern = self::rotateLogPattern($filename, $logType, $base);
        $logFiles = glob($pattern);
        if (empty($logFiles)) {
            return;
        }
        usort($logFiles, function ($a, $b) {
            return strcmp($b, $a);
        });
        foreach (array_slice($logFiles, $maxKeeps) as $file) {
            Log::info("Vendor.LoggerClean - " . $file);
            @unlink($file);
        }
    }

    public static function rotateLog($filename, $logType = null, $maxKeeps = 7, $base = null)
    {
        if (null === $base) {
            $base = storage_path('logs');
        }
        $path = self::rotateLogPath($filename, $logType, $base);
        if (!file_exists($path)) {
            self::rotateLogClean($filename, $logType, $maxKeeps, $base);
        }
        return $path;
    }

    public static function write($file, $type, $label, $msg)
    {
        if (!is_string($msg)) {
            $msg = SerializeUtil::jsonEncode($msg);
        }
        $string = "[" . sprintf('%05d', getmypid()) . "] " . date('Y-m-d H:i:s') . " - $label" . ($msg ? " - $msg" : '');
        $logPath = self::rotateLog($file, $type);
        @file_put_contents($logPath, $string . "\n", FILE_APPEND);
        return $string;
    }

    /**
     * 记录消息日志
     * @param $file string 文件名
     * @param $label string 标签
     * @param $msg string|array|null 信息
     * @return string 写入的日志
     */
    public static function info($file, $label, $msg = null)
    {
        return self::write($file, 'info', $label, $msg);
    }

    /**
     * 记录错误日志
     * @param $file string 文件名
     * @param $label string 标签
     * @param $msg string|array|null 信息
     * @return string 写入的日志
     */
    public static function error($file, $label, $msg = null)
    {
        return self::write($file, 'error', $label, $msg);
    }
}