from shutil import which

from pyfzf import FzfPrompt
from prompt_toolkit import search
from prompt_toolkit.key_binding.key_processor import KeyPressEvent

from .history import FileHistoryWithTimestamp


class Fzf(FzfPrompt):
    def __init__(self):
        self.executable = which("fzf")
        if self.executable:
            super().__init__()

    def is_available(self) -> bool:
        return self.executable is not None


def search_history(event: KeyPressEvent):
    buffer = event.current_buffer
    history = buffer.history

    fzf = Fzf()

    if fzf.is_available() and isinstance(history, FileHistoryWithTimestamp):
        history_items_with_timestamp = history.load_history_with_timestamp()

        formatted_history_items = []
        original_history_items = []
        for item, timestamp in history_items_with_timestamp:
            formatted_item = item.replace("\n", " ")
            timestamp = timestamp.split(".")[0] if "." in timestamp else timestamp
            formatted_history_items.append(f"{timestamp}  {formatted_item}")
            original_history_items.append(item)

        result = fzf.prompt(formatted_history_items, fzf_options="--tiebreak=index")

        if result:
            selected_index = formatted_history_items.index(result[0])
            buffer.text = original_history_items[selected_index]
            buffer.cursor_position = len(buffer.text)
    else:
        # Fallback to default reverse incremental search
        search.start_search(direction=search.SearchDirection.BACKWARD)
