<?php

namespace addons\qrcode\library;

use Endroid\QrCode\ErrorCorrectionLevel;

class Service
{
    /**
     * 生成二维码
     * @param $params
     * @return \Endroid\QrCode\QrCode
     * @throws \Endroid\QrCode\Exception\InvalidPathException
     */
    public static function qrcode($params)
    {
        $config = get_addon_config('qrcode');
        $params = is_array($params) ? $params : [$params];
        $params = array_merge($config, $params);

        $params['labelfontpath'] = isset($params['labelfontpath']) && is_file($params['labelfontpath']) ? $params['labelfontpath'] : ROOT_PATH . 'public' . $config['labelfontpath'];
        $params['logopath'] = isset($params['logopath']) && is_file($params['logopath']) ? $params['logopath'] : ROOT_PATH . 'public' . $config['logopath'];

        // 前景色
        list($r, $g, $b) = sscanf($params['foreground'], "#%02x%02x%02x");
        $foregroundcolor = ['r' => $r, 'g' => $g, 'b' => $b];

        // 背景色
        list($r, $g, $b) = sscanf($params['background'], "#%02x%02x%02x");
        $backgroundcolor = ['r' => $r, 'g' => $g, 'b' => $b];

        // 创建实例
        $qrCode = new \Endroid\QrCode\QrCode($params['text']);
        $qrCode->setSize($params['size']);

        // 高级选项
        $qrCode->setWriterByName($params['format']);
        $qrCode->setMargin($params['padding']);
        $qrCode->setEncoding('UTF-8');
        $qrCode->setErrorCorrectionLevel(new ErrorCorrectionLevel($params['errorlevel']));
        $qrCode->setForegroundColor($foregroundcolor);
        $qrCode->setBackgroundColor($backgroundcolor);

        // 设置标签
        if (isset($params['label']) && $params['label']) {
            $qrCode->setLabel($params['label'], $params['labelfontsize'], $params['labelfontpath'], $params['labelalignment']);
        }

        // 设置Logo
        if (isset($params['logo']) && $params['logo']) {
            $qrCode->setLogoPath($params['logopath']);
            $qrCode->setLogoSize($params['logosize'], $params['logosize']);
        }

        $qrCode->setRoundBlockSize(true);
        $qrCode->setValidateResult(false);
        $qrCode->setWriterOptions(['exclude_xml_declaration' => true]);

        return $qrCode;
    }
}
