<?php

declare(strict_types=1);

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

/**
 * 用户通知偏好表
 *
 * 依据《个人信息保护法》第四十四条，个人对其个人信息处理享有知情权、决定权，
 * 用户可自主选择是否接收推送通知。
 * 依据《通信短信息服务管理规定》第十八条，未经用户同意，不得向其发送商业性短信息。
 */
return new class extends Migration
{
    public function up(): void
    {
        Schema::create('kylin_notification_preferences', function (Blueprint $table) {
            $table->id();
            $table->string('notifiable_type', 125)->comment('通知目标类型');
            $table->unsignedBigInteger('notifiable_id')->comment('通知目标ID');
            $table->string('channel', 32)->comment('渠道: database/mail/aliyun_sms/tencent_sms/wechat_template/jpush/getui/umeng/fcm/apns');
            $table->boolean('enabled')->default(true)->comment('是否启用');
            $table->timestamp('consented_at')->nullable()->comment('用户授权同意时间');
            $table->timestamp('revoked_at')->nullable()->comment('用户撤销授权时间');
            $table->timestamps();

            $table->unique(['notifiable_type', 'notifiable_id', 'channel']);
            $table->index(['notifiable_type', 'notifiable_id']);
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('kylin_notification_preferences');
    }
};
