import type { JourneyStats } from '@/components/UserJourney/JourneyStatsPanel';
import type { AcquisitionTableRowInput } from '@/components/UserJourney/AcquisitionTable';

export type JourneyCountMode = 'sessions' | 'users';

export type FunnelView = {
    start: number;
    product: number;
    cart: number;
    checkout: number;
    purchase: number;
    product_rate_percent: number;
    cart_rate_percent: number;
    checkout_rate_percent: number;
    purchase_rate_percent: number;
    checkout_to_purchase_percent: number;
    startLabel: string;
    countLabel: string;
    unitNote: string;
    purchaseNote: string;
};

export function funnelView(stats: JourneyStats, mode: JourneyCountMode): FunnelView {
    const users = stats.funnel?.users;
    if (mode === 'users' && users) {
        return {
            start: users.total ?? stats.overview.unique_visitors,
            product: users.product,
            cart: users.cart,
            checkout: users.checkout,
            purchase: users.purchase,
            product_rate_percent: users.product_rate_percent,
            cart_rate_percent: users.cart_rate_percent,
            checkout_rate_percent: users.checkout_rate_percent,
            purchase_rate_percent: users.purchase_rate_percent,
            checkout_to_purchase_percent: users.checkout_to_purchase_percent,
            startLabel: 'Users',
            countLabel: 'Count',
            unitNote: 'users',
            purchaseNote: `${users.purchase} orders`,
        };
    }
    return {
        start: stats.funnel.sessions,
        product: stats.funnel.product,
        cart: stats.funnel.cart,
        checkout: stats.funnel.checkout,
        purchase: stats.funnel.purchase,
        product_rate_percent: stats.funnel.product_rate_percent,
        cart_rate_percent: stats.funnel.cart_rate_percent,
        checkout_rate_percent: stats.funnel.checkout_rate_percent,
        purchase_rate_percent: stats.funnel.purchase_rate_percent,
        checkout_to_purchase_percent: stats.funnel.checkout_to_purchase_percent,
        startLabel: 'Session start',
        countLabel: 'Sessions',
        unitNote: 'sessions',
        purchaseNote: `${stats.funnel.purchase} orders`,
    };
}

export function mapAcquisitionRowForMode(
    row: AcquisitionTableRowInput,
    mode: JourneyCountMode
): AcquisitionTableRowInput {
    if (mode !== 'users') return row;
    const users = Number(row.users ?? row.active_users ?? 0);
    const checkout = Number(row.checkout_users ?? row.checkout_sessions ?? 0);
    const purchase = Number(row.purchase_orders ?? row.purchase_users ?? row.purchase_sessions ?? 0);
    const buyers = Number(row.purchase_users ?? 0);
    const engaged = Number(row.engaged_users ?? row.engaged_sessions ?? 0);
    const rate =
        row.purchase_rate_users_percent != null
            ? Number(row.purchase_rate_users_percent)
            : users
              ? Math.round((buyers / users) * 1000) / 10
              : 0;
    return {
        ...row,
        sessions: users,
        checkout_sessions: checkout,
        purchase_sessions: purchase,
        engaged_sessions: engaged,
        purchase_rate_percent: rate,
        active_users: users,
    };
}

export function mapAcquisitionRowsForMode(
    rows: AcquisitionTableRowInput[] = [],
    mode: JourneyCountMode
) {
    return rows.map((row) => mapAcquisitionRowForMode(row, mode));
}
