import os
import re
import time
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor

def process_file(file_path, words_set, output_dir, results):
    try:
        with open(file_path, 'r') as f:
            content = f.read()
            soup = BeautifulSoup(content, 'html.parser')
            title = soup.find('title')
            title_text = title.text.strip() if title else os.path.basename(file_path)
            title_text = title_text.replace('(गायत्री परिवार - Gayatri Pariwar)', '')
            p_elements = soup.find_all('p')
            for p in p_elements:
                p_text = p.get_text()
                p_words = p_text.split()
                indices = [i for i, word in enumerate(p_words) if word.lower() in words_set]
                for idx in indices:
                    start = max(0, idx - 10)
                    end = min(len(p_words), idx + 11)
                    snippet = ' '.join(p_words[start:end])
                    bolded_snippet = snippet
                    for word in words_set:
                        bolded_snippet = bolded_snippet.replace(word, f"<b>{word}</b>")
                    results.append((title_text, os.path.relpath(file_path, output_dir), bolded_snippet, len([w for w in words_set if w in bolded_snippet]), p_text))
    except Exception as e:
        print(f"Error reading {file_path}: {e}")

def search_words(root_dir, words, output_file, phrase):
    if os.path.exists(output_file):
        os.remove(output_file)
    html_parts = [
        "<html><body><h1>Search Results</h1>",
        "<meta http-equiv='content-type' content='text/html; charset=UTF-8'>",
        "<meta charset='utf-8'>",
        f"<script>function copySentence(event) {{navigator.clipboard.writeText('{phrase}');}}</script>",
        "<div id='google_translate_element'></div>",
        "<script type='text/javascript'>function googleTranslateElementInit() {new google.translate.TranslateElement({pageLanguage: 'hi', layout: google.translate.TranslateElement.InlineLayout.SIMPLE}, 'google_translate_element');}</script>",
        "<script type='text/javascript' src='//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'></script>",
        "<ul>"
    ]
    words_set = set(word.strip().lower() for word in words.split(','))
    results = []
    output_dir = os.path.dirname(__file__)
    search_dir = os.path.join(output_dir)
    if not os.path.exists(search_dir):
        os.makedirs(search_dir)

    with ThreadPoolExecutor(max_workers=4) as executor:
        futures = []
        for root, _, files in os.walk(root_dir):
            for file in files:
                if file.endswith('.html'):
                    file_path = os.path.join(root, file)
                    futures.append(executor.submit(process_file, file_path, words_set, output_dir, results))
        for future in futures:
            future.result()

    exact_matches = sorted(
        (result for result in results if result[3] == len(words_set)),
        key=lambda x: tuple(x[2].lower().find(word) for word in words_set)
    )[:100]

    partial_matches = sorted(
        (result for result in results if result[3] != len(words_set)),
        key=lambda x: sum(words_set.index(word) for word in x[2].split() if word in words_set),
        reverse=True
    )[:5]

    for title_text, relative_path, snippet, _, p_text in exact_matches + partial_matches:
        title = snippet + ' ' + p_text[p_text.find(snippet) + len(snippet):].strip()
        stop_chars = ['।', '?', '॥', '.']
        title_end_index = len(snippet) + 115
        for char in stop_chars:
            index = title[:title_end_index].rfind(char)
            if index != -1:
                title_end_index = index + 1
                break
        title = title[:title_end_index].strip()
        title = re.sub('<.*?>', '', title)
        html_parts.append(f"<li><a href='{relative_path}' target='_blank' onclick='copySentence(event)'>{title_text}</a> - {snippet}</li>")

    html_parts.append("</ul></body></html>")
    output_path = os.path.join(search_dir, output_file)
    with open(output_path, 'w') as f:
        f.write(''.join(html_parts))
    print(''.join(html_parts))

def sort_html_file(input_file_name, output_file_name, phrase):
    try:
        with open(input_file_name, 'r', encoding='utf-8', errors='ignore') as f:
            html = f.read()
            print("HTML loaded successfully")

        # Find all links and descriptions
        links_and_descriptions = re.findall(r'<li>.*?<\/li>', html, re.DOTALL)
        print("Links and descriptions found:", len(links_and_descriptions))

        # Extract link and description from each item
        extracted_links_and_descriptions = []
        for item in links_and_descriptions:
            match = re.search(r'href=[\'"]([^\'"]+)[\'"]', item)
            if match:
                link = match.group(1)
                match = re.search(r'>[^<]+?<\/a>', item)
                if match:
                    title = match.group(0)[1:-4]
                    description = re.sub(r'<.*?>', '', item).strip().split('-', 1)[1].strip()
                    extracted_links_and_descriptions.append((link, title, description))

        print("Extracted links and descriptions:", len(extracted_links_and_descriptions))

        # Sort links and descriptions based on the presence of the phrase
        phrase_links_and_descriptions = [x for x in extracted_links_and_descriptions if phrase.lower() in x[2].lower()]
        other_links_and_descriptions = [x for x in extracted_links_and_descriptions if phrase.lower() not in x[2].lower()]

        sorted_phrase_links_and_descriptions = sorted(phrase_links_and_descriptions, key=lambda x: x[2].lower().find(phrase.lower()))
        sorted_other_links_and_descriptions = sorted(other_links_and_descriptions, key=lambda x: x[2].lower().find(phrase.lower()))

        sorted_links_and_descriptions = []
        words = phrase.split()
        added_descriptions = set()

        for link, title, description in sorted_phrase_links_and_descriptions + sorted_other_links_and_descriptions:
            if phrase.lower() in description.lower():
                description = re.sub(r'(' + re.escape(phrase) + r')', r'<b style="background-color: #ffffb0; color: #0000FF; font-weight: bold">\1</b>', description, flags=re.IGNORECASE)
            for word in words:
                if phrase.lower() not in description.lower():
                    description = re.sub(r'(' + re.escape(word) + r')', r'<b>\1</b>', description, flags=re.IGNORECASE)

            description_words = description.split()
            description_hash = tuple(sorted(description_words[:7]))  # Use the first 7 words as a hash
            if description_hash not in added_descriptions:
                sorted_links_and_descriptions.append((link, title, description))
                added_descriptions.add(description_hash)

        print("Links and descriptions sorted")

        # Create the sorted HTML
        sorted_html = '<html><body><h1>Search Results</h1><ul>'
        sorted_html = '<html><body><h1>Search Results</h1>'
        sorted_html += '<meta http-equiv="content-type" content="text/html; charset=UTF-8">'
        sorted_html += '<meta charset="utf-8">'
        sorted_html += f"<script>function copySentence(event) {{navigator.clipboard.writeText('{phrase}');}}</script>"
        sorted_html += '<div id="google_translate_element"></div>'
        sorted_html += '<script type="text/javascript">function googleTranslateElementInit() {new google.translate.TranslateElement({pageLanguage: "hi", layout: google.translate.TranslateElement.InlineLayout.SIMPLE}, "google_translate_element");}</script>'
        sorted_html += '<script type="text/javascript" src="https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>'
        sorted_html += '<ul>'
        for link, title, description in sorted_links_and_descriptions[:38]:
            sorted_html += f'<li><a href="{link}" target="_blank" onclick="copySentence(event)">{title}</a> - {description}</li>'
        sorted_html += '</ul></body></html>'
        print("Sorted HTML created")

        # Save the sorted HTML to the output file
        with open(output_file_name, 'w', encoding='utf-8', errors='ignore') as f:
            f.write(sorted_html)
            print("Sorted HTML saved to output file as", output_file_name)

    except Exception as e:
        print("An error occurred:", str(e))

# Usage example
start = time.time()
root_dir = '../'  # Adjust as needed
phrases = [ 'अक्षत से क्या मतलब है?' ,  'अन्तरंग जीवन क्या है?' ,  'अन्तर्द्वन्द्व क्या है?' ,  'अध्यात्म का क्या अर्थ होता है?' ,  'अध्यात्म किसे कहते हैं?' ,  'अध्यात्म की सही परम्परा क्या हो सकती है?' ,  'अध्यात्म क्या है?' ,  'अध्यात्म से क्या हो जाएगा?' ,  'अध्यात्मवाद क्या होता है?' ,  'अध्यात्मवादी लोग यहाँ कहाँ हैं?' ,  'अपने श्रम का उपयोग कैसे करेंगे?' ,  'अश्वमेध क्या है?' ,  'असली अध्यात्म क्या है?' ,  'आज गृहस्थ जीवन में क्या हो रहा है?' ,  'आप किसके मालिक हैं?' ,  'आप क्या करते हैं रिटायर्ड होकर?' ,  'आप क्या करें?' ,  'आप गायत्री मंत्र को हिंदुओं का क्यों कहते हैं?' ,  'आप तो बढ़ई हैं?' ,  'इस पीड़ित नारी से नर को क्या लाभ मिला?' ,  'इस मेकअप महाविज्ञान से आखिर लाभ क्या?' ,  'इस सारे विश्व का मालिक कौन है?' ,  'उपासना कैसे सार्थक हो सकती है?' ,  'उपासना कैसे हो?' ,  'कबीर क्या करते थे?' ,  'कम कीमत का क्या मतलब है?' ,  'कर्तव्य क्या है?' ,  'कर्मयोग किसे कहते हैं?' ,  'काम क्या करना पड़ेगा?' ,  'कार्य कैसे पूरा होगा?' ,  'कुटुँब कैसे होते हैं?' ,  'कुण्डलिनी जागरण कैसे हो सकता है?' ,  'कैसे कायाकल्प होगा?' ,  'कौन कितना जिया?' ,  'क्या आपने गुरुजी का आशीर्वाद पाया?' ,  'क्या कमजोरी है?' ,  'क्या करना चाहिए?' ,  'क्या करना पड़ेगा?' ,  'क्या करें, क्या न करें?' ,  'क्या काम करना शुरू कर दें?' ,  'क्या मन है आपका?' ,  'क्षत्रिय कौन होता है?' ,  'गणेश कौन होता है?' ,  'गायत्री माता के भक्त कौन होते हैं?' ,  'गायत्री माता क्या है?' ,  'गुरु किसका नाम होता है?' ,  'गुरु कौन है?' ,  'गुरुजी मैं क्या करूँ?' ,  'जप करने से क्या मतलब है?' ,  'जप क्या है?' ,  'जीवन कितने दिन का होता है?' ,  'जीवन क्या है?' ,  'तप किसे कहते हैं?' ,  'तपश्चर्या से लाभ मिलता है?' ,  'तपस्वी जीवन के लिए हमें और आपको क्या करना चाहिए?' ,  'तपाने से क्या होता है?' ,  'तब क्या करना चाहिए आपको?' ,  'तो करना क्या पड़ेगा?' ,  'तो क्या करें?' ,  'देवता कहाँ से निकलते हैं?' ,  'देवता कौन होते हैं?' ,  'देवता बनने के लिए क्या करना पड़ेगा?' ,  'देवता में क्या विशेषता होती है?' ,  'देवपूजन में पानी क्यों चढ़ाते हैं?' ,  'देववृत्तियाँ किसे कहते हैं?' ,  'धर्म क्या है?' ,  'ध्यान का क्या मतलब है?' ,  'ध्यान किसका किया जाता है?' ,  'ध्यान क्यों करें?' ,  'नये युग में और क्या होगा?' ,  'नारी वर्ष का क्या अर्थ है?' ,  'पाप क्या होता है?' ,  'पूजा में हम क्या करते हैं?' ,  'प्रज्ञा किससे जाग्रत होती है?' ,  'प्राण किसे कहते हैं?' ,  'बच्चे को किस तरीके से बनाया जाए और क्या किया जाए?' ,  'बलि किसे कहते हैं?' ,  'बुद्ध क्या थे?' ,  'ब्राह्मण कौन होता है?' ,  'ब्राह्मणत्व क्या होता है?' ,  'भक्त किसे कहते हैं?' ,  'भक्ति कैसी होती है?' ,  'भगवान की भक्ति का सही स्वरूप क्या है?' ,  'भगवान कैसा है?' ,  'भगवान को आपने कैसे देखा?' ,  'भगवान को किस तरीके से खरीदा जा सकता है?' ,  'भगवान क्या है?' ,  'भगवान बनने की विद्या किसने दी?' ,  'भूत कैसा होता है?' ,  'मंत्र में कोई शक्ति होती है?' ,  'मन का भागना बंद करने के क्या तरीके हैं?' ,  'मन ठहर सकता है?' ,  'मनुष्य क्या है?' ,  'मनुष्य मूलतः क्या है?' ,  'मस्तिष्क का सन्तुलन किसे कहते हैं?' ,  'यज्ञ क्या है?' ,  'यज्ञ भगवान की चौथी वाली नसीहत क्या है?' ,  'यह ‘भर्ग’ क्या है?' ,  'ये देवी-देवता हमें क्या देंगे?' ,  'योग किसे कहते हैं?' ,  'योग के अन्य चार पक्ष कौन से हैं?' ,  'योगी बनने के तरीके क्या हो सकते हैं?' ,  'राम-नाम और नारायण का नाम लेने से कोई मुक्ति हो सकती है?' ,  'रावण कैसा बलशाली था?' ,  'वस्तुतः सौन्दर्य है क्या?' ,  'वातावरण किसे कहते हैं?' ,  'वाल्मीकि ऋषि थे कि नहीं थे?' ,  'वासना का स्थान कहाँ है?' ,  'विज्ञानमयकोश किसे कहते हैं?' ,  'विधेयात्मक चिन्तन क्या है?' ,  'शंकर जी कहाँ होते हैं?' ,  'शक्तिपात किसे कहते हैं?' ,  'सबसे अच्छा प्रायश्चित कौन-सा है?' ,  'समर्पण किसे कहते हैं?' ,  'संयम से क्या मतलब है?' ,  'सविता और सावित्री कौन हैं?' ,  'सात्विक आहार क्या है?' ,  'साधना किसे कहते हैं?' ,  'साधु और ब्राह्मण किसे कहते हैं?' ,  'सिनेमा में आप क्या देखने गये थे?' ,  'सुनने से क्या फायदा?' ,  'सैरगाहों में क्या करेंगे?' ,  'हनुमान क्या थे?' ,  'हम चावल क्यों चढ़ाते हैं?' ,  'हम बुद्धिजीवी हैं?' ,  'हमारे गुरु ने क्या दिया?' ,  'हमारे लक्ष्य क्या-क्या हैं?' ,  'हरामखोर कौन हैं?'   ]
output_file_names =  [ 'akshat-kya-hai.html' ,  'antrang-jivan-kya-hai.html' ,  'antardvadv-kya-hai.html' ,  'adhyatm-ka-kya-arth-hota.html' ,  'adhyatm-kise-kahate-hain.html' ,  'adhyatm-ki-parampara-hai.html' ,  'adhyatm-kya-hai.html' ,  'adhyatm-se-kya-hoga.html' ,  'adhyatmvad-kya-hota-hai.html' ,  'adhyatmvadi-yahan-kahan.html' ,  'apane-shram-ka-upyog-kaise-karen.html' ,  'ashwamedh-kya-hai.html' ,  'asali-adhyatm-kya-hai.html' ,  'grihasth-jivan-aaj-hai.html' ,  'aap-kisake-malik-hain.html' ,  'aap-kya-karate-hain-retire-hokar.html' ,  'aap-kya-karen.html' ,  'aap-gayatri-mantra-ko-hinduon-hain.html' ,  'aap-to-badaii-hain.html' ,  'pidit-nari-se-nar-ko.html' ,  'is-makeup-vigyan.html' ,  'sare-vishwa-ka-malik-kaun-hai.html' ,  'upasana-sarthak-kaise-hai.html' ,  'upasana-kaise-ho.html' ,  'kabir-kya-karate-the.html' ,  'kam-kimat-ka-kya-matalab.html' ,  'kartavy-kya-hai.html' ,  'karmyog-kise-kahate-hain.html' ,  'kam-kya-karna-padega.html' ,  'karya-kaise-pura-hoga.html' ,  'kutumb-kaise-hain.html' ,  'kundalini-jagaran-kaise-hai.html' ,  'kaise-kayakalp-hoga.html' ,  'kaun-kitna-jiya.html' ,  'kya-aapne-guruji-ka-ashirwad.html' ,  'kya-kamjori-hai.html' ,  'kya-karna-chahiye.html' ,  'kya-karna-padega.html' ,  'kya-karen-kya-na-karen.html' ,  'kya-kam-karna-shuru.html' ,  'kya-man-hai-aapka.html' ,  'kshatriy-kaun-hota-hai.html' ,  'ganesh-kaun-hota-hai.html' ,  'gayatri-mata-ke-bhakt-kaun-hain.html' ,  'gayatri-mata-kya-hai.html' ,  'guru-kiska-naam-hota-hai.html' ,  'guru-kaun-hai.html' ,  'guruji-mai-kya-karun.html' ,  'jap-ka-matlab-kya-hai.html' ,  'jap-kya-hai.html' ,  'jivan-ka-din-hai.html' ,  'jivan-kya-hai.html' ,  'tap-kise-kahate-hain.html' ,  'taapshcharya-se-labh.html' ,  'tapasvi-jivan-kya-karen.html' ,  'tapane-se-kya-hota-hai.html' ,  'tab-kya-karna-chahiye-aapko.html' ,  'to-karna-kya-padega.html' ,  'to-kya-karen.html' ,  'devta-kahan-se-niklate-hain.html' ,  'devta-kaun-hote-hain .html' ,  'devta-kaise-bane.html' ,  'devta-ki-visheshata-hai.html' ,  'devpujan-pani-kyon-hain.html' ,  'devvritiyan-kya-hain.html' ,  'dharm-kya-hai.html' ,  'dhyan-ka-kya-matalab-hai.html' ,  'dhyan-kiska-kiya-jata-hai.html ' ,  'dhyan-kyon-karen.html' ,  'naye-yug-me-kya-hoga.html' ,  'nari-varsh-ka-arth-kya-hai.html' ,  'paap-kya-hota-hai.html' ,  'puja-me-kya-karate-hain.html' ,  'pragya-kisase-jagrat-hoti-hai.html' ,  'pran-kise-kahte-hain.html' ,  'bacchon-ko-banana.html' ,  'bali-kise-kahate-hain.html' ,  'buddha-kya-the.html' ,  'brahman-kaun-hota-hai.html' ,  'brahmanatv-kya-hota-hai.html' ,  'bhakt-kise-kahte-hain.html' ,  'bhakti-kaisi-hoti-hai-hai.html' ,  'bhagwan-ki-bhakti-ka-swaroop-hai.html' ,  'bhagwan-kaisa-hai.html' ,  'bhagawan-ko-aapne-kaise-dekha.html' ,  'bhagwan-ko-kharidna-hai.html' ,  'bhagwan-kya-hai.html' ,  'bhagwan-banane-ki-vidya.html' ,  'bhut-kaisa-hota-hai.html' ,  'mantra-ki-shakti.html' ,  'man-bhagna-band-karna.html' ,  'man-ka-thahrna.html' ,  'manushy-kya-hai.html' ,  'manushya-mulatah-kya-hai.html' ,  'mashtisk-ka-santulan.html' ,  'yagya-kya-hai.html' ,  'yagya-bhagwan-ki-nasihat-kya-hai.html' ,  'yah-bharg-kya-hota-hai.html' ,  'devi-devta-kya-denge.html' ,  'yog-kise-kahte-hain.html' ,  'yog-ke-char-paksh.html' ,  'yogi-banane-ke-tarike-kya-hain.html' ,  'ram-naam-lene-se-mukti.html' ,  'rawan-kaisa-balshali-tha.html' ,  'vastutah-saundary-kya-hai.html' ,  'vatavaran-kise-kahte-hain.html' ,  'valmiki-rishi-the.html' ,  'vasana-ka-sthan.html' ,  'vigyanmay-kosh-kise-kahte.html' ,  'vidheyatmak-chintan-kya-hai.html' ,  'shankar-ji-kahan-hote-hain.html' ,  'shaktipat-kise-kahate-hain.html' ,  'sabse-accha-prayaschit-kaun-sa-hai.html' ,  'samarpan-kise-kahte-hain.html' ,  'sanyam-se-kya-matlab-hai.html' ,  'savita-aur-savitri-kaun-hain.html' ,  'satvik-aahar-kya-hai.html' ,  'sadhana-kise-kahte-hain.html' ,  'sadu-aur-brahman-kise-kahte-hain.html' ,  'cinema-me-kya-dekhane.html' ,  'suane-se-kya-fayda.html' ,  'sairgahon-me-kya-karenge.html' ,  'hanuman-kya-the.html' ,  'chawal-kyon-chadate-hain.html' ,  'ham-buddhijiwi-hain.html' ,  'hamare-guru-ne-kya-diya.html' ,  'hamare-lakshy-kya-hain.html' ,  'haramkhor-kaun-hain.html'  ]

for phrase, output_file_name in zip(phrases, output_file_names):
    words = ','.join(phrase.split())
    output_file = 'search_multiple_words.html'
    search_words(root_dir, words, output_file, phrase)
    sort_html_file(output_file, output_file_name, phrase)

# Create the final HTML file
with open('search.html', 'w', encoding='utf-8') as f:
    f.write('<html><body>')
    f.write('<h3>आपकी महत्त्वपूर्ण जिज्ञासाएँ - पूज्य गुरुसत्ता के समाधान</h3>')
    f.write("<meta http-equiv='content-type' content='text/html; charset=UTF-8'><meta charset='utf-8'><script>function copySentence(event) {navigator.clipboard.writeText(event.target.textContent);}</script><div id='google_translate_element'></div><script type='text/javascript'>function googleTranslateElementInit() {new google.translate.TranslateElement({pageLanguage: 'hi', layout: google.translate.TranslateElement.InlineLayout.SIMPLE}, 'google_translate_element');}</script><script type='text/javascript' src='https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'></script><ul>")
    for phrase, output_file_name in zip(phrases, output_file_names):
        f.write(f'<li><a href="{output_file_name}" target="_blank" onclick="copySentence(event)">{phrase}</a></li>')
    f.write('</ul></body></html>')

print('search.html created successfully')


end = time.time()
print("Elapsed (with compilation) = %s" % (end - start))
