<?php

declare(strict_types=1);

namespace App\Services;

use App\Models\Project;
use Illuminate\Support\Facades\DB;

/**
 * Резолвер активного поставщика лидов для проекта (Ю-2 / §20.12.3).
 *
 * Используется и в webhook-flow (`ProcessWebhookJob`), и в manual-create
 * (`DealController::store`) — единая логика выбора первого активного
 * supplier'а по `project_suppliers` m2m, чтобы snapshot цены `cost_rub`
 * фиксировался идентично в `supplier_lead_costs` независимо от источника.
 *
 * Алгоритм MVP: первый активный supplier по `(project_suppliers.is_active=true,
 * suppliers.is_active=true)`, ORDER BY `suppliers.sort_order, suppliers.id`.
 *
 * Production roadmap: при отсутствии активного supplier'а у проекта —
 * fallback на `system_settings.default_supplier_id` (отдельный пункт TODO).
 */
class SupplierResolver
{
    /**
     * Возвращает supplier_id первого активного поставщика для project'а
     * либо null, если у проекта нет активных m2m-связей.
     */
    public function resolveForProject(Project $project): ?int
    {
        $row = DB::table('project_suppliers')
            ->join('suppliers', 'suppliers.id', '=', 'project_suppliers.supplier_id')
            ->where('project_suppliers.project_id', $project->id)
            ->where('project_suppliers.is_active', true)
            ->where('suppliers.is_active', true)
            ->orderBy('suppliers.sort_order')
            ->orderBy('suppliers.id')
            ->select('suppliers.id')
            ->first();

        return $row !== null ? (int) $row->id : null;
    }

    /**
     * Возвращает snapshot цены `cost_rub` поставщика на момент вызова.
     * Используется для записи в `supplier_lead_costs.cost_rub` (история
     * закупок не должна меняться при последующих правках цены поставщика).
     */
    public function costRubSnapshot(int $supplierId): string
    {
        return (string) DB::table('suppliers')
            ->where('id', $supplierId)
            ->value('cost_rub');
    }
}
