import { clsx, type ClassValue } from "clsx";
import { twMerge } from "tailwind-merge";
import { differenceInHours, parseISO } from "date-fns";

export function cn(...inputs: ClassValue[]) {
    return twMerge(clsx(inputs));
}

const API_BASE_URL = "https://api.travelmarine.ru";

export const getImageUrl = (relativePath: string): string => {
    if (!relativePath) return "";
    // Если путь уже абсолютный, возвращаем как есть
    if (
        relativePath.startsWith("http://") ||
        relativePath.startsWith("https://")
    ) {
        return relativePath;
    }
    // Убираем начальный слеш, если есть, и формируем абсолютный URL
    const cleanPath = relativePath.startsWith("/")
        ? relativePath.slice(1)
        : relativePath;
    return `${API_BASE_URL}/${cleanPath}`;
};

export const formatWidth = (width: number): string => {
    return width + " метров";
};

export const formatSpeed = (speed: number): string => {
    return speed + " футов";
};

export const formatMinCost = (minCost: number): string => {
    return "от " + minCost + " ₽";
};

export const formatPrice = (price: number): string => {
    return new Intl.NumberFormat("ru-RU").format(price);
};

export interface TotalPriceResult {
    totalHours: number;
    totalPrice: number;
}

export const calculateTotalPrice = (
    departureDate: string | null,
    departureTime: string | null,
    arrivalDate: string | null,
    arrivalTime: string | null,
    pricePerHour: number
): TotalPriceResult => {
    if (
        !departureDate ||
        !departureTime ||
        !arrivalDate ||
        !arrivalTime ||
        !pricePerHour
    ) {
        return { totalHours: 0, totalPrice: 0 };
    }

    try {
        // Создаем полные даты
        const departureDateTime = parseISO(`${departureDate}T${departureTime}`);
        const arrivalDateTime = parseISO(`${arrivalDate}T${arrivalTime}`);

        // Рассчитываем разницу в часах (с округлением до 0.5 часа)
        let hoursDiff = differenceInHours(arrivalDateTime, departureDateTime);

        // Добавляем разницу в минутах
        const minutesDiff =
            (arrivalDateTime.getMinutes() - departureDateTime.getMinutes()) /
            60;
        hoursDiff += minutesDiff;

        // Округляем до ближайших 0.5 часа
        const roundedHours = Math.ceil(hoursDiff * 2) / 2;

        // Рассчитываем стоимость
        const total = pricePerHour * roundedHours;

        return { totalHours: roundedHours, totalPrice: total };
    } catch (error) {
        console.error("Error calculating price:", error);
        return { totalHours: 0, totalPrice: 0 };
    }
};
