/**
 * Маппер `ApiDeal` (backend GET /api/deals) → `MockDeal` (UI-формат).
 *
 * UI-компоненты (DealsView/KanbanView/KanbanCard/DealDetailDrawer) построены
 * вокруг `MockDeal`. Чтобы не переписывать их под backend-форму, маппим
 * на текущий контракт: вычисляем `receivedMinutesAgo` из ISO-метки,
 * подставляем placeholder для отсутствующих manager/project.
 *
 * `cost` пока 0 — отдельного endpoint'а на сделку нет (cost живёт в
 * supplier_lead_costs.cost_rub и снимок берётся в момент webhook'а;
 * на UI-листинге не критично, появится отдельным запросом при необходимости).
 */
import type { ApiDeal, ApiDealEvent } from '../api/deals';
import type { LeadStatus } from './leadStatuses';
import type { DealEvent } from './mockDealEvents';
import type { MockDeal } from './mockDeals';

/**
 * Маппит backend-событие из ActivityLog в `DealEvent` для timeline.
 * Backend `event` slug может быть любым из `deal.*` — clamp на known-types,
 * иначе отображаем как `deal.viewed` (generic-icon).
 */
export function mapApiDealEvent(api: ApiDealEvent, now: Date = new Date()): DealEvent {
    const knownTypes: DealEvent['type'][] = [
        'deal.created',
        'deal.status_changed',
        'deal.viewed',
        'deal.commented',
        'deal.assigned',
        'deal.balance_charged',
    ];
    const type = knownTypes.includes(api.event as DealEvent['type']) ? (api.event as DealEvent['type']) : 'deal.viewed';
    const created = api.created_at ? new Date(api.created_at) : now;
    const minutesAgo = Math.max(0, Math.floor((now.getTime() - created.getTime()) / 60000));

    let detail = '';
    if (api.event === 'deal.status_changed' && api.context) {
        const from = (api.context.from as string) ?? '?';
        const to = (api.context.to as string) ?? '?';
        detail = `${from} → ${to}`;
    } else if (api.event === 'deal.created' && api.context) {
        const source = (api.context.source as string) ?? 'неизвестно';
        detail = `Лид принят (источник: ${source})`;
    } else if (api.context && typeof api.context === 'object') {
        // Generic-fallback: JSON-сводка контекста.
        detail = Object.entries(api.context)
            .map(([k, v]) => `${k}: ${String(v)}`)
            .join(', ');
    }

    return {
        id: api.id,
        type,
        actor: api.actor ? { initials: api.actor.initials, name: api.actor.name } : null,
        minutesAgo,
        detail,
    };
}

export function mapApiDeal(api: ApiDeal, now: Date = new Date()): MockDeal {
    const receivedAt = api.received_at ? new Date(api.received_at) : now;
    const receivedMinutesAgo = Math.max(0, Math.floor((now.getTime() - receivedAt.getTime()) / 60000));

    return {
        id: api.id,
        name: api.contact_name ?? api.phone,
        phone: api.phone,
        statusSlug: api.status as LeadStatus['slug'],
        project: api.project_name ?? '—',
        manager: {
            initials: api.manager_initials ?? '—',
            name: api.manager_name ?? 'Не назначен',
        },
        cost: 0,
        receivedMinutesAgo,
    };
}
