import type { MegaMenuData, MegaMenuItem } from '@/components/layout/navigation';
import type { SiteLayoutClientAreaOption, SiteLayoutClientAreaView } from '@/types';

export type ClientAreaView = 'cliente' | 'parceiro';

const VIEWS: ClientAreaView[] = ['cliente', 'parceiro'];

const COLUMN_LABEL: Record<ClientAreaView, string> = {
    cliente: 'Cliente Omni',
    parceiro: 'Parceiro Omni',
};

/**
 * Copy e foto do handoff desktop (hover de cada item).
 * O href continua o do CMS; título, descrição e imagem seguem o layout.
 */
const MEGA_ITEM: Record<string, Pick<MegaMenuItem, 'title' | 'description' | 'image'>> = {
    'https://auth-cliente.omni.com.br/auto-atendimento-cliente/login': {
        title: 'Meu financiamento',
        description: 'Acesse extrato e boletos do financiamento.',
        image: '/images/megamenu/client-area/meu-financiamento.jpg',
    },
    'https://ib.omni.com.br/login': {
        title: 'Minha conta',
        description: 'Acesse conta corrente e consulte faturas.',
        image: '/images/megamenu/client-area/minha-conta.jpg',
    },
    'https://negocie.omni.com.br/': {
        title: 'Negocie Agora',
        description: 'Negocie suas dívidas com a Omni.',
        image: '/images/megamenu/client-area/negocie-agora.jpg',
    },
    'https://www.bizfacil.com.br/pls/webdad/pck_login.prc_login': {
        title: 'Crediário',
        description: 'Lojista e parceiro que oferece crediário.',
        image: '/images/megamenu/client-area/crediario.jpg',
    },
    'https://ias.biz-br.com/central/biz_menu_pck.entrar': {
        title: 'Cartão de crédito',
        description: 'Lojista e parceiro que oferece cartão de crédito.',
        image: '/images/megamenu/client-area/cartao-credito.jpg',
    },
};

/** Financiamento do parceiro divide o href do Crediário — casa pelo título. */
const PARCEIRO_FINANCIAMENTO: Pick<MegaMenuItem, 'title' | 'description' | 'image'> = {
    title: 'Financiamento',
    description: 'Lojista e parceiro que oferece financiamento.',
    image: '/images/megamenu/client-area/financiamento.jpg',
};

const CLIENTE_ORDER = ['Meu financiamento', 'Minha conta', 'Negocie Agora'];
const PARCEIRO_ORDER = ['Crediário', 'Financiamento', 'Cartão de crédito'];

function megaItem(option: SiteLayoutClientAreaOption, view: ClientAreaView): MegaMenuItem {
    const byHref = MEGA_ITEM[option.href];
    const presentation =
        view === 'parceiro' && option.title === 'Financiamento' ? PARCEIRO_FINANCIAMENTO : byHref;

    return {
        icon: option.icon,
        title: presentation?.title ?? option.title,
        description: presentation?.description ?? option.description,
        href: option.href,
        external: option.external,
        image: presentation?.image,
    };
}

function sortByTitle<T extends { title: string }>(items: T[], order: string[]): T[] {
    return [...items].sort((a, b) => {
        const ai = order.indexOf(a.title);
        const bi = order.indexOf(b.title);
        return (ai === -1 ? order.length : ai) - (bi === -1 ? order.length : bi);
    });
}

function sortItems(items: MegaMenuItem[], order: string[]): MegaMenuItem[] {
    return sortByTitle(items, order);
}

/**
 * Copy do overlay mobile (abas + cards). Href/ícone/external vêm do CMS.
 */
const MOBILE_ITEM: Record<string, Pick<SiteLayoutClientAreaOption, 'title' | 'description'>> = {
    'https://auth-cliente.omni.com.br/auto-atendimento-cliente/login': {
        title: 'Meu financiamento',
        description: 'Acesse o extrato, boletos e muito mais do seu financiamento.',
    },
    'https://ib.omni.com.br/login': {
        title: 'Minha conta',
        description: 'Acesse sua conta corrente pessoa física e pessoa jurídica.',
    },
    'https://negocie.omni.com.br/': {
        title: 'Fatura do cartão',
        description: 'Consulte as faturas do seu cartão de crédito Omni.',
    },
    'https://www.bizfacil.com.br/pls/webdad/pck_login.prc_login': {
        title: 'Crediário',
        description: 'Para lojista e parceiro que oferece crediário Omni.',
    },
    'https://ias.biz-br.com/central/biz_menu_pck.entrar': {
        title: 'Cartão de crédito',
        description: 'Para lojista e parceiro que oferece Cartão de Crédito Omni.',
    },
};

const MOBILE_PARCEIRO_FINANCIAMENTO: Pick<SiteLayoutClientAreaOption, 'title' | 'description'> = {
    title: 'Financiamento',
    description: 'Para lojista e parceiro que oferece Financiamento Omni.',
};

const MOBILE_CLIENTE_ORDER = ['Meu financiamento', 'Minha conta', 'Fatura do cartão'];

export function clientAreaMobileOptions(
    modal: {
        cliente?: SiteLayoutClientAreaView | null;
        parceiro?: SiteLayoutClientAreaView | null;
    } | null | undefined,
    view: ClientAreaView,
): SiteLayoutClientAreaOption[] {
    const options = modal?.[view]?.options ?? [];
    if (!options.length) return [];

    const mapped = options.map((option) => {
        const presentation =
            view === 'parceiro' && option.title === 'Financiamento'
                ? MOBILE_PARCEIRO_FINANCIAMENTO
                : MOBILE_ITEM[option.href];

        return {
            ...option,
            title: presentation?.title ?? option.title,
            description: presentation?.description ?? option.description,
        };
    });

    return sortByTitle(mapped, view === 'cliente' ? MOBILE_CLIENTE_ORDER : PARCEIRO_ORDER);
}

/**
 * Mapeia o conteúdo CMS da Área do cliente para o contrato do mega menu
 * (duas colunas: cliente e parceiro). Sem opções, retorna null.
 */
export function clientAreaToMegaMenu(
    modal?: {
        cliente?: SiteLayoutClientAreaView | null;
        parceiro?: SiteLayoutClientAreaView | null;
    } | null,
): MegaMenuData | null {
    if (!modal) return null;

    const columns = VIEWS.flatMap((key) => {
        const view = modal[key];
        if (!view?.options?.length) return [];

        const items = sortItems(
            view.options.map((option) => megaItem(option, key)),
            key === 'cliente' ? CLIENTE_ORDER : PARCEIRO_ORDER,
        );

        return [{ category: COLUMN_LABEL[key], items }];
    });

    if (!columns.length) return null;

    const featuredImage = columns[0]?.items[0]?.image ?? '';

    return { columns, featuredImage };
}
