import React, { createContext, useContext, useState, useEffect } from 'react';
import { saveToLocalStorage, getFromLocalStorage } from '../services/localStorage';

// Tworzenie kontekstu
const BlogContext = createContext();

// Hook do korzystania z kontekstu
export const useBlogContext = () => useContext(BlogContext);

// Provider kontekstu
export const BlogContextProvider = ({ children }) => {
  // Stan dotyczący tematu bloga
  const [blogTopic, setBlogTopic] = useState('');
  const [targetAudience, setTargetAudience] = useState('');
  
  // Stan dotyczący słów kluczowych
  const [keywords, setKeywords] = useState([]);
  const [currentKeyword, setCurrentKeyword] = useState('');
  
  // Stan dotyczący treści bloga
  const [blogPlan, setBlogPlan] = useState('');
  const [blogContent, setBlogContent] = useState('');
  
  // Stan dotyczący zapisanych tematów
  const [savedTopics, setSavedTopics] = useState([]);
  
  // Stan dotyczący sugestii tematów
  const [topicSuggestions, setTopicSuggestions] = useState([]);
  
  // Stan dotyczący badania konkurencji
  const [keywordResearchShown, setKeywordResearchShown] = useState(false);
  const [competitorInsights, setCompetitorInsights] = useState([]);

  // Przykładowe dane
  const exampleTopics = [
    "Jak znaleźć niszę blogową z niewielką konkurencją",
    "7 strategii promocji bloga w mediach społecznościowych",
    "Jak przekształcić swoją pasję w dochodowego bloga",
    "Najlepsze darmowe narzędzia SEO dla blogerów",
    "Jak budować lojalną społeczność wokół swojego bloga"
  ];
  
  const exampleCompetitorInsights = [
    "Konkurencja rzadko porusza tematy praktycznych kroków wdrożeniowych",
    "Większość blogów w Twojej niszy nie zawiera case studies",
    "Treści konkurencji często brakuje aktualnych danych statystycznych",
    "Niewiele blogów oferuje materiały do pobrania",
    "Konkurencja nie tworzy multimediów (wideo, infografiki)"
  ];

  // Ładowanie zapisanych tematów z localStorage
  useEffect(() => {
    const storedTopics = getFromLocalStorage('savedTopics');
    if (storedTopics) {
      setSavedTopics(storedTopics);
    }
  }, []);

  // Generowanie sugestii tematów na podstawie słów kluczowych
  useEffect(() => {
    if (keywords.length > 0 && targetAudience) {
      setTopicSuggestions([
        `Jak ${keywords[0]} może pomóc ${targetAudience} osiągnąć lepsze wyniki`,
        `Przewodnik po ${keywords[0]} dla początkujących ${targetAudience}`,
        `${keywords.length > 1 ? keywords[1] : keywords[0]} vs. tradycyjne metody: Co wybierają ${targetAudience}?`,
        `5 sposobów wykorzystania ${keywords[0]} w codziennej pracy ${targetAudience}`,
        `Jak ${targetAudience} może zaoszczędzić czas dzięki ${keywords[0]}`
      ]);
    }
  }, [keywords, targetAudience]);

  // Funkcje do zarządzania słowami kluczowymi
  const addKeyword = () => {
    if (currentKeyword && !keywords.includes(currentKeyword)) {
      setKeywords([...keywords, currentKeyword]);
      setCurrentKeyword('');
    }
  };

  const removeKeyword = (keywordToRemove) => {
    setKeywords(keywords.filter(keyword => keyword !== keywordToRemove));
  };

  // Funkcja do zapisywania tematu
  const saveTopic = () => {
    if (blogTopic) {
      const newTopic = {
        id: Date.now(),
        topic: blogTopic,
        audience: targetAudience,
        keywords: [...keywords],
        date: new Date().toLocaleDateString()
      };
      
      const updatedTopics = [...savedTopics, newTopic];
      setSavedTopics(updatedTopics);
      saveToLocalStorage('savedTopics', updatedTopics);
      
      return true;
    }
    return false;
  };

  // Funkcja do usuwania zapisanego tematu
  const removeSavedTopic = (topicId) => {
    const updatedTopics = savedTopics.filter(topic => topic.id !== topicId);
    setSavedTopics(updatedTopics);
    saveToLocalStorage('savedTopics', updatedTopics);
  };

  // Funkcja do ładowania zapisanego tematu
  const loadSavedTopic = (topicId) => {
    const topic = savedTopics.find(t => t.id === topicId);
    if (topic) {
      setBlogTopic(topic.topic);
      setTargetAudience(topic.audience);
      setKeywords(topic.keywords);
      return true;
    }
    return false;
  };

  // Funkcja do włączania/wyłączania sekcji badania słów kluczowych
  const toggleKeywordResearch = () => {
    setKeywordResearchShown(!keywordResearchShown);
    
    if (!keywordResearchShown) {
      const randomInsights = [];
      const shuffled = [...exampleCompetitorInsights].sort(() => 0.5 - Math.random());
      
      for (let i = 0; i < 3; i++) {
        if (shuffled[i]) {
          randomInsights.push(shuffled[i]);
        }
      }
      
      setCompetitorInsights(randomInsights);
    }
  };

  // Funkcja do generowania planu bloga
  const generateBlogPlan = () => {
    if (blogTopic) {
      const newPlan = `
# Plan dla tematu: ${blogTopic}

## 1. Wprowadzenie
- Zarysowanie problemu, który rozwiązuje artykuł
- Korzyści dla czytelnika z przeczytania artykułu
- Krótkie przedstawienie zawartości

## 2. Kontekst i znaczenie tematu
- Dlaczego ten temat jest ważny
- Kto może skorzystać z tych informacji
- Aktualne trendy związane z tematem

## 3. Główne punkty (3-5 sekcji)
- Punkt 1: Wyzwanie/problem
- Punkt 2: Metody/rozwiązania
- Punkt 3: Wdrożenie
- Punkt 4: Przykłady/case studies
- Punkt 5: Wskazówki eksperckie

## 4. Praktyczne zastosowania
- Konkretne kroki do wdrożenia
- Narzędzia pomocne w implementacji
- Potencjalne przeszkody i jak je pokonać

## 5. Podsumowanie
- Streszczenie kluczowych punktów
- Call to action
- Zachęta do dyskusji w komentarzach

## Słowa kluczowe do uwzględnienia:
${keywords.join(', ')}

## Docelowi odbiorcy:
${targetAudience}
      `;
      
      setBlogPlan(newPlan);
      return true;
    }
    return false;
  };

  // Funkcja do generowania treści bloga
  const generateBlogContent = () => {
    if (blogTopic && blogPlan) {
      const newContent = `
# ${blogTopic}

## Wprowadzenie

W dzisiejszym dynamicznym świecie blogosfery, wybór odpowiedniego tematu może zdecydować o sukcesie lub porażce Twojego bloga. Dla ${targetAudience}, znalezienie tematów, które rezonują z odbiorcami i jednocześnie wyróżniają się na tle konkurencji, stanowi prawdziwe wyzwanie. W tym artykule przyjrzymy się sprawdzonym metodom odkrywania angażujących tematów, które przyciągną uwagę Twoich czytelników i wzmocnią Twoją pozycję w branży.

## Dlaczego wybór tematu ma kluczowe znaczenie?

Wybór odpowiedniego tematu to fundament skutecznego blogowania. Dobrze dobrany temat:
- Przyciąga dokładnie tę grupę odbiorców, którą chcesz zainteresować
- Zwiększa szanse na wyższe pozycje w wynikach wyszukiwania
- Buduje Twoją pozycję jako eksperta w danej dziedzinie
- Naturalnie generuje zaangażowanie czytelników

Według najnowszych badań, blogi z precyzyjnie określoną tematyką mają o 73% wyższy współczynnik konwersji niż te o ogólnej tematyce. To pokazuje, jak istotne jest strategiczne podejście do wyboru tematu.

## Skuteczne metody odkrywania wyróżniających się tematów

### 1. Badanie słów kluczowych jako podstawa

Rozpocznij od zbadania, czego Twoi potencjalni czytelnicy szukają w internecie. Narzędzia takie jak Keywordtool.io, Ubersuggest, Semrush czy Ahrefs pozwalają odkryć nie tylko popularne frazy w Twojej niszy, ale również tzw. "long-tail keywords" - dłuższe, bardziej specyficzne frazy, które mają mniejszą konkurencję.

**Wskazówka ekspercka:** Szukaj słów kluczowych z miesięczną liczbą wyszukiwań między 100 a 1000 - to często idealna nisza z wystarczającym zainteresowaniem, ale umiarkowaną konkurencją.

### 2. Analiza aktualnych trendów branżowych

${keywords[0] ? `Szczególnie w tematach związanych z "${keywords[0]}"` : 'W każdej branży'}, trendy mogą szybko się zmieniać. Monitoruj:
- Popularne hashtagi na Twitterze i LinkedIn
- Gorące tematy na forach branżowych
- Nagłówki w specjalistycznych newsletterach
- Tematy poruszane na konferencjach branżowych

### 3. Strategiczna analiza konkurencji

Nie chodzi o kopiowanie tego, co robią inni, ale o znalezienie luk tematycznych, które możesz wypełnić. Przeanalizuj 5-10 najpopularniejszych blogów w Twojej niszy i zadaj sobie pytania:
- Jakich tematów unikają?
- Gdzie ich treści są powierzchowne?
- Jakie pytania pozostawiają bez odpowiedzi?

### 4. Inspiracja z własnych doświadczeń

Twoje unikalne doświadczenia są skarbnicą tematów blogowych. Zastanów się:
- Jakie wyzwania pokonałeś w swojej branży?
- Jakie nieoczywiste rozwiązania znalazłeś dla typowych problemów?
- Jakie błędy popełniłeś, których inni mogliby uniknąć?

### 5. Wsłuchiwanie się w głos społeczności

Platformy takie jak Reddit, Quora czy grupy na Facebooku to kopalnie pomysłów na tematy. Szukaj pytań, które są często zadawane, ale rzadko otrzymują wyczerpujące odpowiedzi.

## Jak nadać tematowi unikalną perspektywę

Wybranie popularnego tematu to dopiero początek. Aby naprawdę się wyróżnić:

1. **Dodaj dane i badania** - Wprowadź statystyki, których konkurencja nie prezentuje
2. **Podziel się osobistą historią** - Ludzki element czyni treść bardziej autentyczną
3. **Oferuj narzędzia i szablony** - Praktyczne zasoby zwiększają wartość Twojego artykułu
4. **Przedstaw przeciwstawne opinie** - Odważ się kwestionować powszechnie przyjęte "prawdy" w Twojej branży
5. **Zaktualizuj przestarzałe informacje** - Odśwież klasyczne tematy najnowszymi trendami i danymi

## Podsumowanie

Wybór wyróżniającego się tematu dla Twojego bloga to proces, który łączy badania, strategiczne myślenie i kreatywność. Pamiętaj, że najlepsze tematy to te, które znajdują się na przecięciu trzech elementów: tego, co interesuje Twoich czytelników, tego, na czym się znasz, i tego, co wyróżnia Cię na tle konkurencji.

Które z przedstawionych metod odkrywania tematów planujesz wypróbować jako pierwsze? Podziel się swoimi przemyśleniami w komentarzach poniżej!

---

*Ten artykuł został przygotowany dla ${targetAudience} poszukujących inspiracji do tworzenia angażujących treści blogowych.*
      `;
      
      setBlogContent(newContent);
      return true;
    }
    return false;
  };

  // Funkcja do kopiowania tekstu do schowka
  const copyToClipboard = (text) => {
    return navigator.clipboard.writeText(text)
      .then(() => true)
      .catch(() => false);
  };

  // Wartości udostępniane przez kontekst
  const contextValue = {
    // Stan
    blogTopic,
    targetAudience,
    keywords,
    currentKeyword,
    blogPlan,
    blogContent,
    savedTopics,
    topicSuggestions,
    keywordResearchShown,
    competitorInsights,
    exampleTopics,

    // Funkcje do aktualizacji stanu
    setBlogTopic,
    setTargetAudience,
    setKeywords,
    setCurrentKeyword,
    setBlogPlan,
    setBlogContent,
    setTopicSuggestions,

    // Funkcje pomocnicze
    addKeyword,
    removeKeyword,
    saveTopic,
    removeSavedTopic,
    loadSavedTopic,
    toggleKeywordResearch,
    generateBlogPlan,
    generateBlogContent,
    copyToClipboard
  };

  return (
    <BlogContext.Provider value={contextValue}>
      {children}
    </BlogContext.Provider>
  );
};

export default BlogContext;