<?php

namespace App\Distributor\Repositories;

use App\Models\DistMessage as DistMessageModel;
use Dcat\Admin\Grid;
use Dcat\Admin\Repositories\Repository;
use Illuminate\Pagination\LengthAwarePaginator;

class DistCustomMessage extends Repository
{
    protected $eloquentClass = DistMessageModel::class;

    /**
     * 定义主键字段名称
     *
     * @return string
     */
    public function getPrimaryKeyColumn()
    {
        return 'id';
    }


    /**
     * 重写 get 方法
     *
     * @param Grid\Model $model
     * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator|\Illuminate\Database\Eloquent\Collection|array
     */
    public function get(Grid\Model $model)
    {
        // 当前页数
        $currentPage = $model->getCurrentPage();
        // 每页显示行数
        $perPage = $model->getPerPage();

        // 获取排序字段
        [$orderColumn, $orderType] = $model->getSort();

        // 获取当前登录用户的 ID
        $userId = getDistributorId();

        // 使用 getMessagesForUser 方法获取消息列表
        $messages = $this->getMessagesForUser($userId);

        // 获取总记录数
        $total = $messages->count();

        // 分页数据
        $data = $messages->slice(($currentPage - 1) * $perPage, $perPage)->values();


        foreach ($data as $value) {


            $value['created_at']=$value['created_at']->toDateTimeString();

            $data_out[]=$value;
        }


        return $model->makePaginator(
            $total, // 传入总记录数
            $data_out
        );
    }

    /**
     * 获取最近 N 条消息
     *
     * @param int $limit
     * @return \Illuminate\Support\Collection
     */
    public function getRecentMessages($limit = 10)
    {
        // 获取当前登录用户的 ID
        $userId = getDistributorId();

        // 使用 getMessagesForUser 方法获取消息列表
        $messages = $this->getMessagesForUser($userId);

        // 获取最近 N 条消息
        $recentMessages = $messages->take($limit);

        return $recentMessages;
    }


    public function getMessagesForUser($userId)
    {

        //$userId=str($userId);

        return DistMessageModel::where('target_type', 'all')
            ->orWhere(function ($query) use ($userId) {
                $query->where('target_type', 'users')
                    ->whereJsonContains('target_ids', str($userId));
            })
            ->with(['readStatuses' => function ($query) use ($userId) {
                $query->where('user_id', $userId);
            }])
            ->orderBy('created_at', 'desc')
            ->get()
            ->map(function ($message) use ($userId) {
                $isRead = $message->readStatuses->isNotEmpty() && $message->readStatuses->first()->is_read;
                if(!$isRead)
                {
                    $isRead=0;
                }
                return [
                    'id' => $message->id,
                    'title' => $message->title,
                    'content' => $message->content,
                    'sender_id' => $message->sender_id,
                    'created_at' => $message->created_at,
                    'is_read' => $isRead,
                ];
            });
    }

    /**
     * 判断用户是否有权限查看指定 ID 的消息
     *
     * @param int $messageId
     * @return bool
     */
    public static function canViewMessage($messageId)
    {

        // 获取当前登录用户的 ID
        $userId = getDistributorId();

        // 检查消息是否存在且属于当前用户
        $message = DistMessageModel::where('id', $messageId)
            ->where(function ($query) use ($userId) {
                $query->where('target_type', 'all')
                    ->orWhere(function ($query) use ($userId) {
                        $query->where('target_type', 'users')
                            ->whereJsonContains('target_ids', str($userId));
                    });
            })
            ->first();



        return $message !== null;
    }

}