<?php

namespace Kylin\Sms;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Notification;
use Kylin\Sms\Channels\SmsChannel;

/**
 * 短信服务提供者
 * 
 * 负责注册短信服务到 Laravel 容器，
 * 发布配置文件，扩展通知渠道
 */
class SmsServiceProvider extends ServiceProvider
{
    /**
     * 注册服务
     * 
     * 将短信管理器和各网关注册到服务容器
     */
    public function register(): void
    {
        // 合并配置文件
        $this->mergeConfigFrom(
            __DIR__ . '/../config/sms.php',
            'sms'
        );

        // 注册短信服务
        $this->registerSmsService();
    }

    /**
     * 注册短信服务
     * 
     * 将 SmsManager 注册为单例
     */
    protected function registerSmsService(): void
    {
        $this->app->singleton('sms', function ($app) {
            return new SmsManager($app);
        });

        $this->app->alias('sms', SmsManager::class);
    }

    /**
     * 启动服务
     * 
     * 发布配置文件，注册通知渠道扩展
     */
    public function boot(): void
    {
        // 发布配置文件
        if ($this->app->runningInConsole()) {
            $this->publishes([
                __DIR__ . '/../config/sms.php' => config_path('sms.php'),
            ], 'sms-config');
        }

        // 扩展通知渠道，添加 sms 渠道
        Notification::extend('sms', function ($app) {
            return new SmsChannel($app['sms']);
        });
    }

    /**
     * 获取提供的服务
     * 
     * 用于延迟加载服务提供者
     * 
     * @return array 服务列表
     */
    public function provides(): array
    {
        return ['sms', SmsManager::class];
    }
}
