/**
 * BLOCK_REGISTRY: mapa code -> componente React.
 * Cada componente registrado segue o contrato:
 *   props: { code, size, config, trendMode, ...contextProps }
 *   internamente consome useDashboardFilters() para obter dados.
 *
 * Codes "{provider}_{metric}" sao resolvidos dinamicamente por IntegrationKpiBlock.
 */

import IntegrationKpiBlock from "./blocks/IntegrationKpiBlock";
import BlockSeparator from "./blocks/BlockSeparator";
import BlockIntegrationKpis from "./blocks/BlockIntegrationKpis";
import BlockIntegrationTimeline from "./blocks/BlockIntegrationTimeline";
import {
    BlockGoogleAdsCampaigns,
    BlockGoogleAdsAds,
    BlockGoogleAdsKeywords,
    BlockMetaAdsCampaigns,
    BlockMetaAdsAdSets,
    BlockMetaAdsAds,
    BlockGa4Channels,
    BlockGa4Events,
    BlockGa4SourceMedium,
    BlockGa4Campaigns,
    BlockGa4Pages,
    BlockGscDrilldown,
} from "./blocks/BlockProviderDrilldown";
import {
    BlockExentHubSourceSummary,
    BlockExentHubCampaignSummary,
    BlockExentHubKeywordSummary,
} from "./blocks/BlockExentHubSummary";
import { usePage } from "@inertiajs/react";
import { useDashboardFilters } from "@/context/DashboardFiltersContext";
import SocialPostsDrilldown from "./SocialPostsDrilldown/SocialPostsDrilldown";
import BlockSocialFunnel from "./blocks/BlockSocialFunnel";
import SocialEngagementComposition from "./blocks/SocialEngagementComposition";
import { CvCrmPeriodBlock } from "./tabs/CvCrmTab";

const PROVIDER_PREFIXES = ["google_ads", "meta_ads", "exent_hub", "ga4", "search_console", "instagram_social"];

/** Drill-down de social orgânico (listagem de postagens) para o editor de templates. */
function BlockSocialPostsDrilldown() {
    const project = usePage().props.project;
    const { startDate, endDate } = useDashboardFilters();
    if (!project?.id) return null;
    return (
        <SocialPostsDrilldown
            projectId={project.id}
            startDate={startDate}
            endDate={endDate}
            provider="instagram_social"
        />
    );
}

export const BLOCK_REGISTRY = {
    // Blocos gerais (disponiveis em qualquer aba)
    separator: BlockSeparator,
    // Grupo de KPIs por integracao
    google_ads_block_kpis:     (props) => <BlockIntegrationKpis {...props} provider="google_ads" />,
    meta_ads_block_kpis:       (props) => <BlockIntegrationKpis {...props} provider="meta_ads" />,
    ga4_block_kpis:            (props) => <BlockIntegrationKpis {...props} provider="ga4" />,
    search_console_block_kpis: (props) => <BlockIntegrationKpis {...props} provider="search_console" />,
    instagram_social_block_kpis: (props) => <BlockIntegrationKpis {...props} provider="instagram_social" />,
    exent_hub_block_kpis:      (props) => <BlockIntegrationKpis {...props} provider="exent_hub" />,
    // Evolucao temporal por integracao (GA4 tem chart proprio na aba Trafego)
    google_ads_block_timeline:     (props) => <BlockIntegrationTimeline {...props} provider="google_ads" />,
    meta_ads_block_timeline:       (props) => <BlockIntegrationTimeline {...props} provider="meta_ads" />,
    search_console_block_timeline: (props) => <BlockIntegrationTimeline {...props} provider="search_console" />,
    instagram_social_block_timeline: (props) => <BlockIntegrationTimeline {...props} provider="instagram_social" />,
    exent_hub_block_timeline:      (props) => <BlockIntegrationTimeline {...props} provider="exent_hub" />,
    // Drilldowns por nivel: cada code do catalogo ({provider}_block_drilldown_*)
    // mapeia para um unico nivel do drill-down completo do provedor.
    google_ads_block_drilldown_campaigns: BlockGoogleAdsCampaigns,
    google_ads_block_drilldown_ads:       BlockGoogleAdsAds,
    google_ads_block_drilldown_keywords:  BlockGoogleAdsKeywords,
    meta_ads_block_drilldown_campaigns:   BlockMetaAdsCampaigns,
    meta_ads_block_drilldown_adsets:      BlockMetaAdsAdSets,
    meta_ads_block_drilldown_ads:         BlockMetaAdsAds,
    ga4_block_drilldown_channels:         BlockGa4Channels,
    ga4_block_drilldown_events:           BlockGa4Events,
    ga4_block_drilldown_source_medium:    BlockGa4SourceMedium,
    ga4_block_drilldown_campaigns:        BlockGa4Campaigns,
    ga4_block_drilldown_pages:            BlockGa4Pages,
    // Search Console: drill-down único (abas), não fatiado por dimensão.
    search_console_block_drilldown: BlockGscDrilldown,
    // Instagram Social: funil + composição do engajamento + drill-down (postagens).
    instagram_social_block_funnel: BlockSocialFunnel,
    instagram_social_block_engagement: SocialEngagementComposition,
    instagram_social_block_drilldown: BlockSocialPostsDrilldown,
    // CVCRM (Construtor de Vendas): aba dedicada, mas os blocos de PERÍODO ficam disponíveis
    // no editor de templates. Cada um reusa o renderPeriodo (só o bloco alvo) via CvCrmPeriodBlock.
    cvcrm_block_kpis:             () => <CvCrmPeriodBlock blockKey="block_kpis" />,
    cvcrm_block_funil:            () => <CvCrmPeriodBlock blockKey="block_funil" />,
    cvcrm_block_evolucao:         () => <CvCrmPeriodBlock blockKey="block_evolucao" />,
    cvcrm_block_origem_leads:     () => <CvCrmPeriodBlock blockKey="block_origem_leads" />,
    cvcrm_block_estoque_situacao: () => <CvCrmPeriodBlock blockKey="block_estoque_situacao" />,
    cvcrm_block_vendas_midia:     () => <CvCrmPeriodBlock blockKey="block_vendas_midia" />,
    cvcrm_block_ciclo:            () => <CvCrmPeriodBlock blockKey="block_ciclo" />,
    cvcrm_block_motivo_perda:     () => <CvCrmPeriodBlock blockKey="block_motivo_perda" />,
    cvcrm_block_roi:              () => <CvCrmPeriodBlock blockKey="block_roi" />,
    cvcrm_block_corretores:       () => <CvCrmPeriodBlock blockKey="block_corretores" />,
    cvcrm_block_reservas:         () => <CvCrmPeriodBlock blockKey="block_reservas" />,
    // Rankings agregados do Exent Hub (mesmas visualizacoes da aba Leads)
    exent_hub_source_summary:   BlockExentHubSourceSummary,
    exent_hub_campaign_summary: BlockExentHubCampaignSummary,
    exent_hub_keyword_summary:  BlockExentHubKeywordSummary,
};

export function resolveBlock(code, localDispatch) {
    if (localDispatch && localDispatch[code]) return localDispatch[code];
    if (BLOCK_REGISTRY[code]) return BLOCK_REGISTRY[code];
    for (const p of PROVIDER_PREFIXES) {
        if (code.startsWith(p + "_")) return IntegrationKpiBlock;
    }
    return null;
}
