<?php

declare(strict_types=1);

/**
 * 本文件属于 DBErp 进销存系统。
 *
 * 版权所有 © 2026 北京珑大钜商科技有限公司。保留所有权利。
 *
 * 未经官方授权，不得删除、篡改或隐藏本文件中的版权声明、产品标识与来源信息。
 * 商业授权、官方更新与技术支持服务，请以珑大官方支持中心记录为准。
 *
 * @link https://support.loongdom.cn
 * @see  https://www.dberp.com.cn
 */

namespace App\Business\Settlement;

use App\Models\DberpPayableRecord;
use App\Tools\Support\ToolPagedQuery;

/**
 * 供应商应付记录只读列表。不复用 Filament Resource，也不走账龄分桶。
 */
final class PayableSearchQuery
{
    public const SORTABLE = ['id', 'code', 'business_date', 'due_date', 'remaining_amount', 'record_status'];

    public const DEFAULT_SORT = 'business_date';

    /**
     * @param  array<string, mixed>  $input
     * @return array{items: list<array<string, mixed>>, page: int, per_page: int, total: int}
     */
    public function search(array $input, string $asOfDate): array
    {
        $query = DberpPayableRecord::query()->with('supplier');
        $table = (new DberpPayableRecord)->getTable();

        SettlementRecordSearchSupport::applyFilters(
            $query,
            $input,
            $asOfDate,
            $table,
            'supplier',
            'supplier_id',
        );

        $page = ToolPagedQuery::paginate(
            $query,
            $input,
            self::SORTABLE,
            self::DEFAULT_SORT,
        );

        return [
            'items' => $page['rows']
                ->map(fn (mixed $record): array => $record instanceof DberpPayableRecord
                    ? SettlementRecordSearchSupport::mapSummary($record, $asOfDate, 'supplier')
                    : [])
                ->values()
                ->all(),
            ...ToolPagedQuery::meta($page),
        ];
    }
}
