import { useState, useEffect, useCallback } from 'react';

export interface SearchItem {
  id: string;
  title: string;
  path: string;
  category: string;
  type: 'protocol' | 'procedure' | 'drug';
  keywords?: string[];
}

const PROTOCOLS_INDEX: SearchItem[] = [
  // Soporte Vital
  { id: 'rcp-adulto', title: 'RCP Adulto', path: '/rcp', category: 'soporte-vital', type: 'protocol' },
  { id: 'rcp-pediatria', title: 'RCP Pediatría', path: '/rcp', category: 'soporte-vital', type: 'protocol' },
  { id: 'rcp-lactantes', title: 'RCP Lactantes', path: '/rcp', category: 'soporte-vital', type: 'protocol' },
  { id: 'ovace', title: 'OVACE', path: '/via-aerea', category: 'soporte-vital', type: 'protocol' },
  { id: 'desa', title: 'DESA', path: '/protocolo/uso-desa', category: 'soporte-vital', type: 'protocol' },
  
  // Urgencias
  { id: 'ictus', title: 'Ictus', path: '/ictus', category: 'urgencias', type: 'protocol' },
  { id: 'sca', title: 'Síndrome Coronario Agudo (SCA)', path: '/protocolo/sca', category: 'urgencias', type: 'protocol' },
  { id: 'shock', title: 'Shock', path: '/shock', category: 'urgencias', type: 'protocol' },
  { id: 'anafilaxia', title: 'Anafilaxia', path: '/protocolo/anafilaxia', category: 'urgencias', type: 'protocol' },
  { id: 'crisis-asmatica', title: 'Crisis Asmática', path: '/protocolo/crisis-asmatica', category: 'urgencias', type: 'protocol' },
  { id: 'hipoglucemia', title: 'Hipoglucemia', path: '/protocolo/hipoglucemia', category: 'urgencias', type: 'protocol' },
  
  // Procedimientos
  { id: 'abcde', title: 'ABCDE Operativo', path: '/herramientas', category: 'procedimientos', type: 'procedure' },
  { id: 'glasgow', title: 'Escala Glasgow', path: '/herramientas', category: 'procedimientos', type: 'procedure' },
  { id: 'triage-start', title: 'Triage START', path: '/herramientas', category: 'procedimientos', type: 'procedure' },
  { id: 'constantes', title: 'Constantes Vitales', path: '/herramientas', category: 'procedimientos', type: 'procedure' },
  { id: 'parto', title: 'Parto de Emergencia', path: '/parto', category: 'emergencias', type: 'protocol' },
  
  // Farmacos
  { id: 'adrenalina', title: 'Adrenalina', path: '/farmacos', category: 'farmacologia', type: 'drug', keywords: ['epinefrina'] },
  { id: 'aspirina', title: 'Aspirina', path: '/farmacos', category: 'farmacologia', type: 'drug' },
  { id: 'salbutamol', title: 'Salbutamol', path: '/farmacos', category: 'farmacologia', type: 'drug' },
  { id: 'oxigeno', title: 'Oxígeno', path: '/farmacos', category: 'farmacologia', type: 'drug' },
  { id: 'glucagon', title: 'Glucagon', path: '/farmacos', category: 'farmacologia', type: 'drug' },
  
  // Telefono
  { id: 'telefono-rcp', title: 'RCP por Teléfono', path: '/telefono', category: 'transtelefonicos', type: 'protocol' },
  { id: 'telefono-ovace', title: 'OVACE por Teléfono', path: '/telefono', category: 'transtelefonicos', type: 'protocol' },
  { id: 'telefono-comunicacion', title: 'Comunicación Coordinador', path: '/telefono', category: 'transtelefonicos', type: 'protocol' },
];

const CATEGORY_LABELS: Record<string, string> = {
  'soporte-vital': 'Soporte Vital',
  'urgencias': 'Urgencias',
  'procedimientos': 'Procedimientos',
  'farmacologia': 'Farmacología',
  'transtelefonicos': 'Transtelefónicos',
  'emergencias': 'Emergencias',
};

export function useSearch() {
  const [results, setResults] = useState<SearchItem[]>([]);
  const [loading, setLoading] = useState(false);

  const search = useCallback((query: string): SearchItem[] => {
    if (!query || query.length < 2) {
      return [];
    }

    const lowerQuery = query.toLowerCase();
    const queryWords = lowerQuery.split(' ').filter(w => w.length > 0);

    const scored = PROTOCOLS_INDEX.map(item => {
      const titleLower = item.title.toLowerCase();
      const categoryLower = item.category.toLowerCase();
      const keywordsLower = (item.keywords || []).join(' ').toLowerCase();
      
      let score = 0;
      
      // Exact match in title
      if (titleLower === lowerQuery) score += 100;
      // Starts with query
      else if (titleLower.startsWith(lowerQuery)) score += 80;
      // Contains query
      else if (titleLower.includes(lowerQuery)) score += 50;
      
      // Keyword match
      if (keywordsLower.includes(lowerQuery)) score += 40;
      
      // Category match
      if (categoryLower.includes(lowerQuery)) score += 20;
      
      // Word matching
      for (const word of queryWords) {
        if (titleLower.includes(word)) score += 10;
        if (keywordsLower.includes(word)) score += 5;
      }

      return { item, score };
    });

    return scored
      .filter(s => s.score > 0)
      .sort((a, b) => b.score - a.score)
      .slice(0, 10)
      .map(s => s.item);
  }, []);

  const getResults = useCallback((query: string) => {
    setLoading(true);
    const results = search(query);
    setResults(results);
    setLoading(false);
    return results;
  }, [search]);

  return {
    results,
    loading,
    search,
    getResults,
    categories: CATEGORY_LABELS,
  };
}
