<?php

namespace App\Services;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
use Endroid\QrCode\Builder\Builder;
use Endroid\QrCode\Writer\PngWriter;
use Telegram\Bot\Api;
use App\Models\Config;
use Telegram\Bot\FileUpload\InputFile;
use Illuminate\Support\Facades\Log;

class BaseService 
{
    const YES = 1;
    const NOT = 0;
    /**
     * @description: 生成充值二维码
     * @param {*} $address 充值地址
     * @return {*}
     */    
    public static function createRechargeQrCode($address = '')
    {
        $content = $address;
        $qrSize = 300;
        $font = 4;
        $textHeight = 20;
        $padding = 10;

        // 生成二维码图像对象
        $result = Builder::create()
            ->writer(new PngWriter())
            ->data($content)
            ->size($qrSize)
            ->margin(0)
            ->build();

        $qrImage = imagecreatefromstring($result->getString());

        // 创建画布（加上下方文字区和边距）
        $canvasWidth = $qrSize + $padding * 2;
        $canvasHeight = $qrSize + $textHeight + $padding * 2;
        $image = imagecreatetruecolor($canvasWidth, $canvasHeight);

        // 背景白色
        $white = imagecolorallocate($image, 255, 255, 255);
        imagefill($image, 0, 0, $white);

        // 黑色字体
        $black = imagecolorallocate($image, 0, 0, 0);

        // 合并二维码图像
        imagecopy($image, $qrImage, $padding, $padding, 0, 0, $qrSize, $qrSize);

        // 写文字
        $textWidth = imagefontwidth($font) * strlen($content);
        $x = ($canvasWidth - $textWidth) / 2;
        $y = $qrSize + $padding + 5;
        imagestring($image, $font, $x, $y, $content, $black);

        // 生成文件名
        $filename = $address. '.png';
        $relativePath = 'recharge/' . $filename;
        $storagePath = storage_path('app/public/' . $relativePath);

        // 确保目录存在
        @mkdir(dirname($storagePath), 0777, true);

        // 保存图片到文件
        imagepng($image, $storagePath);

        // 清理
        imagedestroy($qrImage);
        imagedestroy($image);

        // 返回 public 存储路径（可用于 URL）
        return 'storage/'.$relativePath; // 或返回 Storage::url($relativePath);
    }

    /**
     * 判断指定地址的二维码是否已生成（已存在文件）
     *
     * @param string $address 充值地址
     * @return 
     */
    public static function rechargeQrCodeExists(string $address)
    {
        $filename = $address . '.png';
        $relativePath = 'recharge/' . $filename;
        $storagePath = storage_path('app/public/' . $relativePath);
        $path = '';
        if(file_exists($storagePath)){
            $path = 'storage/'.$relativePath;
        }
        return $path;
    }


    /**
     * @description: 转成树形数据
     * @param {*} $list 初始数据
     * @param {*} $pid 父id
     * @param {*} $level 层级
     * @param {*} $pid_name pid字段名称 默认pid
     * @param {*} $id_name  主键id 名称
     * @return {*}
     */    
    public static function toTree($list,$pid=0,$level=0,$pid_name='pid',$id_name='id')
    {
        $arr=[];
        $level++;
        foreach($list as $k => $v){
            if($pid==$v[$pid_name]){
                $v['level']=$level;
                $v['children']=self::toTree($list,$v[$id_name],$level,$pid_name,$id_name);
                $arr[]=$v;
            }
        }
        return $arr;
    }

    /**
     * @description: 实例化TG
     * @return {*}
     */    
    public static function telegram()
    {
        return app(Api::class);
    }

    /**
     * @description: 群组通知
     * @param {string} $text 通知内容
     * @param {array} $keyboard 操作按钮
     * @param {*string} $image  图片
     * @return {*}
     */    
    public static function bettingGroupNotice($text ,$keyboard = [], $image = '')
    {
        $bettingGroup = Config::where('field', 'betting_group')->first()->val;

        $botMsg = [
            'chat_id' => "@{$bettingGroup}",
            'text' => $text
        ];
        if(count($keyboard)>0){
            $botMsg['reply_markup'] = json_encode(['inline_keyboard' => $keyboard]);
        }
        if(!empty($image)){
            $botMsg['photo'] = InputFile::create($image);
            $botMsg['caption'] = $text;
            $botMsg['protect_content'] = true;  // 防止转发
            self::telegram()->sendPhoto($botMsg);
        }else{
            self::telegram()->sendMessage($botMsg);
        }
    }

    /**
     * @description: 弹窗提示
     * @param {*} $memberId
     * @param {*} $address
     * @return {*}
     */
    public static function alertNotice($callbackId ,$text)
    {
        self::telegram()->answerCallbackQuery([
            'callback_query_id' => $callbackId,
            'text' => $text,
            'show_alert' => true // 显示为弹窗
        ]);
    }

    public static function log($message, $context = [])
    {
        Log::error($message, $context);
    }

    /**
     * @description: 获取操作按钮
     * @return {*}
     */
    public static function getOperateButton()
    {
        $username = config('services.telegram.username');
        $serviceAccount = Config::where('field', 'service_account')->first()->val??'';
        $officialChannel = Config::where('field', 'official_channel')->first()->val??'';
        $inlineButton = [];
        $inlineButton[] = [
            ['text' => "查看余额", 'callback_data' => 'balanceAlert'],
            ['text' => "✅唯一财务", 'url' => "https://t.me/{$serviceAccount}"]
        ];
        $inlineButton[] = [
            ['text' => "近期注单", 'callback_data' => 'betsAlert'],
            ['text' => "今日流水", 'callback_data' => 'todayFlowAlert']
        ];
        $inlineButton[] = [
            ['text' => "私聊下注", 'url' => "https://t.me/{$username}"]
        ];
        $inlineButton[] = [
            ['text' => "官方频道", 'url' => "https://t.me/{$officialChannel}"]
        ];
        return $inlineButton;
    }
}