# faq_screen.py
# Versão: 2.4 (Ajustes de Estilo na Busca e Perguntas)
# Data: 25/06/2025
# Descrição: Módulo de FAQ com caixa de busca estilizada e fontes ajustadas.

import tkinter as tk
from tkinter import ttk

from .i18n import get_translator

# Cores e Fontes
COLOR_BG = "#F5F5F5"
COLOR_SECTION_BG = "#EAEAEA"
COLOR_TEXT = "#333333"
COLOR_QUESTION_BG = "#E0E0E0"
COLOR_QUESTION_FG = "#000000"
COLOR_SEARCH_BG = "#FFFFE0" # Amarelo claro para a caixa de busca

# --- FONTE MODIFICADA AQUI (sem negrito) ---
FONT_QUESTION = ("Segoe UI", 10)
# ------------------------------------------
FONT_ANSWER = ("Segoe UI", 10)


class AccordionItem(tk.Frame):
    """ Um item individual do FAQ (uma pergunta e uma resposta). """
    def __init__(self, parent, question, answer, **kwargs):
        super().__init__(parent, **kwargs)
        self.configure(bg=COLOR_BG)
        self.is_expanded = False

        self.question_text = question
        self.answer_text = answer

        question_frame = tk.Frame(self, bg=COLOR_QUESTION_BG)
        question_frame.pack(fill="x", pady=(0, 1))

        self.question_button = tk.Button(
            question_frame,
            text=f">  {self.question_text}",
            anchor="w",
            justify="left",
            font=FONT_QUESTION,
            bg=COLOR_QUESTION_BG,
            fg=COLOR_QUESTION_FG,
            activebackground="#C5C5C5",
            activeforeground=COLOR_QUESTION_FG,
            relief=tk.FLAT,
            borderwidth=0,
            command=self.toggle
        )
        self.question_button.pack(fill="x", padx=10, pady=5)

        self.answer_frame = tk.Frame(self, bg=COLOR_SECTION_BG)
        self.answer_label = tk.Label(
            self.answer_frame,
            text=self.answer_text,
            font=FONT_ANSWER,
            bg=COLOR_SECTION_BG,
            fg=COLOR_TEXT,
            wraplength=850,
            justify="left",
            padx=15,
            pady=10
        )
        self.answer_label.pack(fill="x")

    def toggle(self):
        """ Alterna a visibilidade da resposta. """
        if self.is_expanded:
            self.answer_frame.pack_forget()
            self.question_button.config(text=f">  {self.question_text}")
            self.is_expanded = False
        else:
            self.answer_frame.pack(fill="x", pady=(0, 5), padx=5)
            self.question_button.config(text=f"v  {self.question_text}")
            self.is_expanded = True


class FaqScreen(tk.Frame):
    """ A classe principal que constrói a tela de FAQ com busca. """
    def __init__(self, parent):
        super().__init__(parent, bg=COLOR_BG)
        # Importante: quem controla o geometry manager é o AppShell.
        # Não chamar pack/grid aqui para evitar conflito pack/grid.
        # Sistema de tradução
        self.translator = get_translator()

        # Base de perguntas/respostas em inglês
        self.faq_data_en = [
             ("How to position the equipment and tag to be evaluated ?", "The original antenna has a traditional dipole radiation pattern. Position the tag facing the original antenna."),
             ("What is the requirement for the computer operational system ?", "Windows 7 or greater."),
             ("What is the minimal required hardware configuration ?", "Processor: Intel i3 | Memory: 2 GB | Disk Space: 250 GB."),
             ("Is it possible to use a different antenna ?", "You can use a different antenna but the results will change depending on the antenna gain."),
             ("Are the measurements absolute or relative values ?", "Without calibration, measurements are relative and should be compared only under the same setup. With active calibration, forward/reverse correction is applied and results become more consistent between sessions and modules, but comparisons still require the same distance and positioning conditions."),
             ("What are the main conditions to compare tag performance ?", "Comparisons must be done with the same distance and position of the equipment and tags, to ensure consistent results."),
             ("What to do if the module power reaches the limits of 5 dBm or 25 dBm ?", "If it reaches 5 dBm, increase the distance. If it reaches 25 dBm, reduce the distance. In both cases, keep the distance that lets you focus on the frequency range of interest."),
             ("What to do if there is test progress but no plotted results ?", "Check if the tag is registered, if it is highlighted in the list, if the distance is correct (reduce if needed), and if antenna and tag are well aligned."),
             ("What to do if there are gaps in the plotted line ?", "Gaps are usually caused by reaching 5 dBm or 25 dBm limits. Adjust the distance to avoid the limits, unless it is an intrinsic behavior of the tag."),
             ("What is the module power ?", "The module power is the RF power generated by the reader module."),
             ("What is irradiated power ?", "The irradiated power is the power delivered to the antenna and radiated by it."),
             ("What is the backscattered power ?", "The backscattered power is the signal reflected and sent back by the tag."),
             ("What is the threshold point ?", "The threshold is the minimum transmitted power needed to successfully read the tag."),
             ("Why is the threshold important to measure tag performance ?", "It defines the tag sensitivity: the lower the threshold, the more sensitive the tag."),
             ("What to do when I need to register one tag and there are other tags around ?", "Place the tag to be registered very close to the antenna and look for the strongest RSSI. Other tags may affect the measurement but sometimes this represents the real scenario."),
             ("What to do if I cannot register a tag ?", "Place the tag closer to the antenna, increase power, and check if the tag is OK."),
             ("Is the measurement distance important ?", "Yes, especially when comparing tags. Keep the same distance and adjust it so measurements stay inside the power limits for the frequency range of interest."),
             ("When should I specify a frequency band ?", "Selecting a band reduces test time and helps you focus on the frequencies of interest."),
             ("What do the shaded areas in the graphs mean ?", "They represent ETSI and FCC bands, helping you to see if a tag is tuned for those regions."),
             ("Is it necessary to apply a tag on a product to evaluate its performance ?", "Yes. Most tags are designed to work attached to cardboard, plastic, wood, etc. Test them on the real product to find the best position."),
             ("How do I know that a tag is tuned ?", "You will see lower required power in the frequency of interest."),
             ("What to do if the equipment stops with a high temperature message ?", "Let the equipment rest to cool down before starting a new test."),
             ("What is the temperature limit ?", "It is the maximum internal temperature allowed to avoid damage."),
             ("What to do if the equipment shows 'check antenna' message ?", "Check antenna position, connection, and any metallic objects near it."),
             ("What is the limit for antenna failure ?", "It is a combination of power level and antenna VSWR."),
             ("What to do if, when changing tags for comparison, the module reaches 5 or 25 dBm again ?", "If the limits are reached inside the band of interest, adjust the distance and repeat all tests for all tags."),
             ("Can noise affect the measurement ?", "Yes. Check the Noise module (Noise Check)."),
             ("How can I reduce ambient noise ?", "Look for other RF sources around, like phones or other readers. Some electrical equipment may also add noise."),
             ("How should I transport the equipment and antenna ?", "Disconnect the original antenna and USB cable. Transport them in a protective box (the original shipping box is a good option)."),
             ("How to get information about the software ?", "Open the License page."),
             ("How to check license validation ?", "Open the License page and click on 'Reload System Information'."),
             ("How to obtain the operation license ?", "On the License page, click 'Auto License', enter the Token received by email, then click 'Register'."),
             ("How can I know if my license has an expiration date ?", "It is shown on the License page."),
             ("What to do if the equipment says there is no registration or license ?", "Reload the license information in the License page or contact support."),
             ("What is 'Reload Information' used for ?", "It reloads license and system information from disk/server."),
             ("What is 'Register License' used for ?", "It stores the license information so the software can access the hardware."),
             ("What is 'Import License' used for ?", "To load a license from a previously saved file (offline activation)."),
             ("What is 'Export License' used for ?", "To save your license to an external location for backup."),
             ("What is the Software Version?", "It identifies the software build and feature set."),
             ("What is the Hardware Version ?", "It identifies the hardware revision."),
             ("What is the Firmware Version ?", "It identifies the firmware running inside the hardware."),
             ("What is the frequency range ?", "It is the allowed frequency span you can configure for operation."),
             ("What is the License type ?", "It defines which features and options are enabled."),
             ("What is the Power Range ?", "It is the minimum and maximum RF power supported."),
             ("What is the Power Step ?", "It is the power increment used between measurements."),
             ("What is the License Issue Date ?", "It is the date when the license was issued."),
             ("What is the Serial ?", "It is the serial number of the hardware."),
             ("What is the Expiration Date ?", "It is the date when the license expires, if applicable."),
             ("What is www.getfasttag.com ?", "Website with information about the FastTag product line."),
             ("What is the Start button in Noise Check ?", "It starts the Noise Check measurement."),
             ("What is the Stop button in Noise Check ?", "It stops the Noise Check measurement."),
             ("What is 'Clear Graph' in Noise Check ?", "It clears the Noise Check graph."),
             ("What is the warranty of the equipment ?", "One year from purchase, unless otherwise specified."),
             ("What are the warning messages for Antenna Check ?", "They indicate mismatch or nearby objects disturbing antenna operation."),
             ("What are the warning messages for Temperature ?", "They indicate high internal temperature, requiring a cool-down period."),
             ("What is the power button in Antenna Check used for ?", "To test whether the antenna can be safely used with reduced power even with mismatch."),
             ("What is the red line in the graph ?", "It marks the maximum allowed value; above it the equipment will stop for protection."),
             ("What does 'FAIL Antenna Failure' mean and how to fix it ?", "It indicates a problem in the antenna or connections. Check cables, connectors, impedance (50 Ω), and objects near the antenna."),
             ("What is the communication protocol used ?", "It is the air protocol used during tag interrogation (e.g., EPC Gen2)."),
             ("Is antenna polarization important ?", "Yes. Antenna and tag must be aligned to get the best performance."),
             ("How to align antenna and tag ?", "The original antenna is linearly polarized; align the tag's sensitive axis with the antenna polarization."),
             ("Is it necessary to run measurements in non-aligned positions ?", "Sometimes yes, if the real installation cannot be aligned. Expect lower performance or even no reads in blind zones."),
             ("What is this equipment used for ?", "To evaluate tag behavior over frequency and compare tags or materials."),
             ("Who typically uses this equipment ?", "System integrators, labs, universities and professionals working with RFID."),
             ("Can I operate the equipment outdoors ?", "Yes, but respect the environmental limits for dust and water."),
             ("How should I store the equipment and antenna ?", "Store them in a clean, dry place, protected from dust and water."),
             ("How to register a new project ?", "Click 'Register a New Project', type the project name and click 'Save'."),
             ("How to import an existing project ?", "Click 'Import Project', select the .gftb file and click 'Open'."),
             ("How to export a project ?", "Click 'Export', choose a folder and save the project file."),
             ("What is a tag file type ?", "Tag files use the .json extension."),
             ("How to register a new tag ?", "Place the tag near the antenna, go to 'Select an action' → 'Register New Tags' → choose Power → 'Start Search'."),
             ("What is the power adjustment used for when registering a tag ?", "Use the lowest power that still reads the tag to reduce interference from other tags."),
             ("What are EPC and RSSI when registering a tag ?", "EPC is the tag ID; RSSI is the backscattered signal strength."),
             ("What is the RSSI order button for when registering tags ?", "It helps you choose the tag with strongest RSSI when multiple tags are detected."),
             ("What is the frequency step used for ?", "It defines the frequency resolution of the measurements."),
             ("What is the 'description' field used for ?", "To label and identify a particular test configuration."),
             ("What to do if the Start button is not working ?", "Check if there is at least one registered tag and if it is highlighted in the list."),
             ("What is the Calibration module used for ?", "Calibration measures and stores correction values (Power on Tag Forward and Reverse) using a standard tag, then applies those corrections to measurement modules."),
             ("Which modules use calibration corrections ?", "Corrections are applied in measurement modules such as Threshold, FastThreshold, FastSurance, Fast Orientation, RSSI x Power and Constant Power. Noise Check and Antenna Check are not corrected by Calibration."),
             ("Can I use Calibration without a valid active license ?", "No. Calibration depends on an active valid license and the frequency/power limits allowed by that license."),
             ("Why are Min Freq and Max Freq locked in Calibration ?", "In version 3.0, these limits come from the active license to ensure compliant measurements and avoid out-of-range tests."),
             ("Why does Calibration frequency step offer 1 MHz or 5 MHz ?", "These are the supported sweep modes. With step 5 MHz, the saved correction profile is interpolated to a 1 MHz grid for consistent application."),
             ("Why is threshold search using 0.5 dBm step ?", "This is aligned with the hardware/DLL behavior and gives better threshold precision in Threshold and Calibration flows."),
             ("Can I use comma as decimal separator in frequency fields ?", "Yes. Frequency numeric fields in Threshold and related flows accept both comma and dot (for example: 915,5 or 915.5)."),
             ("Why did 'Threshold (dBm)' labels change ?", "To make terminology explicit. Labels were updated to 'Reader Power Tag Threshold (dBm)' or 'Module Power Tag Threshold (dBm)' depending on the module context."),
             ("What changed when selecting tags in Threshold history charts ?", "The chart now preserves visual state (zoom/pan) while you switch between tags, making historical comparison easier."),
             ("What does the duplicate tag registration warning show now ?", "When trying to register existing tags, the warning explicitly lists duplicated EPC values and indicates how many new tags can still be saved."),
             ("How does automatic PDF/file opening work in reports and exports ?", "After generating reports or exporting data, the app can open PDFs and folders using the system default application. If a method fails, it falls back to alternative Windows-safe strategies."),
        ]

        # Versão em português
        self.faq_data_pt = [
             ("Como posicionar o equipamento e a tag a ser avaliada?", "A antena original tem um padrão de irradiação de dipolo. Posicione a tag de frente para a antena original."),
             ("Qual o requisito do sistema operacional do computador?", "Windows 7 ou superior."),
             ("Qual a configuração mínima de hardware recomendada?", "Processador: Intel i3 | Memória: 2 GB | Espaço em disco: 250 GB."),
             ("É possível usar outra antena?", "Sim, mas os resultados mudam conforme o ganho e as características da antena utilizada."),
             ("As medições são absolutas ou relativas?", "Sem calibração, as medições são relativas e devem ser comparadas no mesmo setup de teste. Com a calibração ativa, as correções Forward/Reverse são aplicadas e os resultados ficam mais consistentes entre sessões e módulos, mas a comparação ainda exige as mesmas condições de distância e posicionamento."),
             ("Quais são as principais condições para comparar o desempenho de tags?", "Use sempre a mesma distância e posição entre equipamento e tags para ter comparações consistentes."),
             ("O que fazer se a potência atingir os limites de 5 dBm ou 25 dBm?", "Se chegar a 5 dBm, aumente a distância. Se chegar a 25 dBm, reduza a distância e mantenha-a adequada à faixa de frequência de interesse."),
             ("O que fazer se o teste avança mas não aparece gráfico?", "Verifique se a tag está registrada, se está destacada na lista, se a distância está correta (reduza, se necessário) e se antena e tag estão bem alinhadas."),
             ("O que fazer se houver falhas na linha do gráfico?", "Geralmente indica que o módulo está batendo nos limites de 5 dBm ou 25 dBm. Ajuste a distância para evitar os limites, a menos que seja um comportamento intrínseco da tag."),
             ("O que é a potência do módulo?", "É a potência de RF gerada pelo módulo leitor."),
             ("O que é potência irradiada?", "É a potência que chega à antena e é irradiada por ela."),
             ("O que é potência retroespalhada (backscatter)?", "É o sinal refletido e enviado de volta pela tag."),
             ("O que é o ponto de limiar (threshold)?", "É a menor potência transmitida que ainda permite ler a tag."),
             ("Por que o threshold é importante na medição do desempenho da tag?", "Ele define a sensibilidade da tag: quanto menor o threshold, mais sensível é a tag."),
             ("O que fazer para registrar uma tag quando há outras tags próximas?", "Aproxime ao máximo a tag de interesse da antena e observe o maior RSSI. As demais tags podem interferir, mas às vezes isso reflete o cenário real."),
             ("O que fazer se não consigo registrar uma tag?", "Aproxime a tag da antena, aumente a potência e confira se a tag está funcionando."),
             ("A distância de medição é importante?", "Sim, principalmente para comparar tags. Mantenha a mesma distância e ajuste-a para que as medições fiquem dentro da faixa de potência permitida."),
             ("Quando devo especificar uma faixa de frequência?", "Para reduzir o tempo de teste e focar apenas na faixa de interesse."),
             ("O que significam as áreas sombreadas nos gráficos?", "Representam as bandas ETSI e FCC, ajudando a ver se a tag está sintonizada nessas regiões."),
             ("É necessário aplicar a tag no produto para avaliar o desempenho?", "Sim. A maioria das tags é projetada para funcionar aplicada em caixas de papelão, plástico, madeira etc. Teste no produto real para achar a melhor posição."),
             ("Como saber se uma tag está sintonizada?", "Ela exigirá menos potência na frequência de interesse."),
             ("O que fazer se o equipamento parar com mensagem de alta temperatura?", "Pare os testes e deixe o equipamento esfriar antes de reiniciar."),
             ("Qual é o limite de temperatura?", "É a temperatura interna máxima permitida para evitar danos ao módulo."),
             ("O que fazer se o equipamento mostrar mensagem para verificar a antena?", "Verifique a posição da antena, conexão do cabo e presença de objetos metálicos próximos."),
             ("Qual é o limite para falha de antena?", "É resultado da combinação entre nível de potência e VSWR da antena."),
             ("O que fazer se, ao trocar de tag para comparar resultados, o módulo voltar a atingir 5 ou 25 dBm?", "Se os limites forem atingidos na faixa de interesse, ajuste a distância e repita os testes em todas as tags envolvidas."),
             ("Ruídos podem afetar a medição?", "Sim. Use o módulo \"Noise Check\" para avaliar o ruído."),
             ("Como reduzir o ruído ambiente?", "Verifique outros leitores RFID ou celulares próximos. Alguns equipamentos elétricos também podem gerar ruído."),
             ("Qual é a forma correta de transportar o equipamento e a antena?", "Desconecte antena e cabo USB e transporte tudo em uma caixa protegida (idealmente a caixa original)."),
             ("Como obter informações sobre o software?", "Acesse a página de Licença."),
             ("Como verificar a validação da licença?", "Na página de Licença, clique em \"Reload System Information\"."),
             ("Como obter a licença de operação?", "Na página de Licença, clique em \"Auto License\", informe o Token recebido por e-mail e clique em \"Register\"."),
             ("Como saber se minha licença tem data de expiração?", "Essa informação aparece na página de Licença."),
             ("O que fazer se o equipamento informar que não há registro ou licença?", "Recarregue as informações de licença ou entre em contato com o suporte."),
             ("Para que serve o botão \"Reload Information\"?", "Recarrega as informações de licença e sistema."),
             ("Para que serve o botão \"Register License\"?", "Registra as informações de licença necessárias para acessar o hardware."),
             ("Para que serve o botão \"Import License\"?", "Permite importar uma licença salva anteriormente (ativação offline)."),
             ("Para que serve o botão \"Export License\"?", "Permite salvar sua licença em outro local para backup."),
             ("O que é a versão de software?", "É o número de controle do software, indicando recursos e revisões."),
             ("O que é a versão de hardware?", "É o número de revisão do hardware."),
             ("O que é a versão de firmware?", "É a versão do firmware interno do equipamento."),
             ("O que é a faixa de frequência?", "É o intervalo de frequências configurável para operação."),
             ("O que é o tipo de licença?", "Define quais recursos e opções estão habilitados."),
             ("O que é a faixa de potência?", "É a potência mínima e máxima suportada pelo equipamento."),
             ("O que é o passo de potência?", "É o incremento de potência entre os pontos de medição."),
             ("O que é a data de emissão da licença?", "Data em que a licença foi emitida."),
             ("O que é o número de série?", "É o número de série do hardware."),
             ("O que é a data de expiração da licença?", "É a data em que a licença expira, se houver expiração."),
             ("O que é o site www.getfasttag.com?", "Site com informações sobre a linha de produtos FastTag."),
             ("Para que serve o botão Start do Noise Check?", "Inicia a medição de ruído."),
             ("Para que serve o botão Stop do Noise Check?", "Interrompe a medição de ruído."),
             ("Para que serve o botão Clear Graph do Noise Check?", "Limpa o gráfico de ruído exibido na tela."),
             ("Qual é a garantia do equipamento?", "Em geral, 1 ano a partir da data de compra."),
             ("Quais são os avisos do Antenna Check?", "Indicam que a antena não está bem acoplada ao equipamento ou que há objetos próximos interferindo na operação."),
             ("Quais são os avisos de Temperatura?", "Indicam que a temperatura interna está alta e que é necessário aguardar o resfriamento."),
             ("Para que serve o ajuste de potência no Antenna Check?", "Permite testar se a antena pode ser usada com potência reduzida mesmo com algum desajuste."),
             ("O que é a linha vermelha no gráfico?", "Marca o limite máximo permitido; acima dele o equipamento interrompe a operação para se proteger."),
             ("O que significa a mensagem FAIL Antenna Failure e como corrigir?", "Indica problema na antena ou conexões. Verifique posição, cabos, conectores, impedância de 50 Ω e objetos próximos."),
             ("Qual é o protocolo de comunicação utilizado?", "É o protocolo de comunicação com a tag (por exemplo, EPC Gen2)."),
             ("A polarização da antena é importante?", "Sim. Antena e tag devem estar alinhadas para obter melhor desempenho."),
             ("Como fazer o alinhamento entre antena e tag?", "A antena original é linearmente polarizada; alinhe o eixo sensível da tag com a polarização da antena."),
             ("É necessário medir em posições não alinhadas?", "Às vezes sim, se o cenário real exige. Nesses casos o desempenho pode ser pior ou até não haver leitura em áreas de sombra."),
             ("Para que este equipamento é usado?", "Para avaliar o comportamento da tag em função da frequência e comparar tags ou materiais."),
             ("Quem são os principais usuários do equipamento?", "Integradores de sistemas, laboratórios, universidades e profissionais que trabalham com RFID."),
             ("Posso operar o equipamento em ambiente externo?", "Sim, respeitando os limites de poeira e respingos de água."),
             ("Como devo armazenar o equipamento e a antena?", "Armazene em local seco, limpo e protegido contra poeira e umidade."),
             ("Como registrar um novo projeto?", "Clique em \"Register a New Project\", informe o nome em \"Project name\" e clique em \"Save\"."),
             ("Como importar um projeto existente?", "Clique em \"Import Project\", selecione o arquivo .gftb desejado e clique em \"Open\"."),
             ("Como exportar um projeto?", "Clique em \"Export\" e escolha a pasta onde o projeto será salvo."),
             ("Qual é o tipo de arquivo de tag?", "Arquivos de tag usam a extensão \".json\"."),
             ("Como registrar uma nova tag?", "Posicione a tag próxima à antena. Vá em \"Select an action\" → \"Register New Tags\" → escolha a potência → \"Start Search\"."),
             ("Para que serve o ajuste de potência ao registrar uma tag?", "Use a menor potência possível para ler a tag desejada e evitar capturar tags vizinhas."),
             ("O que são EPC e RSSI no registro de tag?", "EPC é a identificação da tag; RSSI é a intensidade do sinal retroespalhado."),
             ("Para que serve a ordenação por RSSI na tela de registro de tags?", "Ajuda a selecionar a tag com maior RSSI quando várias são detectadas."),
             ("Para que serve o passo de frequência?", "Define o detalhamento em frequência das medições."),
             ("Para que serve o campo \"description\"?", "Ajuda a identificar e descrever o conjunto de medições."),
             ("O que fazer se o botão Start não funcionar?", "Verifique se existe ao menos uma tag registrada e se ela está destacada na lista."),
             ("Para que serve o módulo Calibration?", "A calibração mede e grava correções (Power on Tag Forward e Reverse) com uma tag padrão, e depois aplica essas correções nos módulos de medição."),
             ("Quais módulos usam as correções da calibração?", "As correções são aplicadas em módulos de medição como Threshold, FastThreshold, FastSurance, Fast Orientation, RSSI x Power e Constant Power. Noise Check e Antenna Check não recebem correção da Calibration."),
             ("Posso usar a Calibration sem licença ativa válida?", "Não. A Calibration depende de uma licença ativa válida e dos limites de frequência/potência permitidos por essa licença."),
             ("Por que Min Freq e Max Freq ficam travados na Calibration?", "Na versão 3.0, esses limites vêm da licença ativa para garantir medições dentro do permitido e evitar testes fora da faixa licenciada."),
             ("Por que a Calibration permite passo de frequência de 1 MHz ou 5 MHz?", "Esses são os modos de varredura suportados. Quando o passo é 5 MHz, o perfil salvo é interpolado para malha de 1 MHz para aplicação consistente."),
             ("Por que a busca de threshold usa passo de 0,5 dBm?", "Esse passo está alinhado ao comportamento do hardware/DLL e melhora a precisão do threshold nos fluxos de Threshold e Calibration."),
             ("Posso usar vírgula como separador decimal nos campos de frequência?", "Sim. Campos numéricos de frequência no Threshold e fluxos relacionados aceitam vírgula e ponto (ex.: 915,5 ou 915.5)."),
             ("Por que os rótulos 'Threshold (dBm)' mudaram?", "Para deixar a métrica mais explícita. Os rótulos foram atualizados para 'Reader Power Tag Threshold (dBm)' ou 'Module Power Tag Threshold (dBm)' conforme o contexto do módulo."),
             ("O que mudou ao selecionar tags no histórico de gráficos do Threshold?", "Agora o gráfico preserva o estado visual (zoom/pan) ao trocar de tag, facilitando a comparação histórica."),
             ("Como está o aviso de registro de tag duplicada?", "Ao tentar registrar tags já existentes, o aviso informa explicitamente os EPCs duplicados e quantas tags novas ainda podem ser salvas."),
             ("Como funciona a abertura automática de PDF/arquivos nos relatórios e exportações?", "Após gerar relatório ou exportar dados, o app pode abrir PDF e pasta no aplicativo padrão do sistema. Se um método falhar, ele tenta alternativas seguras para Windows."),
        ]
        
        # Será preenchido por idioma
        self.faq_data = []
        self.no_results_text = ""

        title_frame = tk.Frame(self, bg=COLOR_BG)
        title_frame.pack(fill="x", pady=(10, 2))
        self.title_label = tk.Label(title_frame, text="", font=("Segoe UI", 16, "bold"), bg=COLOR_BG, fg=COLOR_TEXT)
        self.title_label.pack()
        
        # --- Search Box com Estilo e Largura Ajustados ---
        search_frame = tk.Frame(self, bg=COLOR_BG)
        # pack() sem fill/expand centraliza o frame
        search_frame.pack(pady=5)
        
        self.search_label = tk.Label(search_frame, text="", font=("Segoe UI", 10), bg=COLOR_BG)
        self.search_label.pack(side="left", padx=(5,5))
        
        self.search_var = tk.StringVar()
        self.search_var.trace_add("write", self._filter_faq)
        search_entry = tk.Entry(
            search_frame, 
            textvariable=self.search_var, 
            font=("Segoe UI", 10), 
            width=60, # Largura reduzida
            bg=COLOR_SEARCH_BG, # Cor de fundo para destaque
            relief=tk.SOLID,
            borderwidth=1
        )
        search_entry.pack(side="left")
        # --- Fim da Modificação ---

        canvas_container = tk.Frame(self)
        canvas_container.pack(fill="both", expand=True, padx=20, pady=10)
        
        self.canvas = tk.Canvas(canvas_container, bg=COLOR_BG, highlightthickness=0)
        scrollbar = ttk.Scrollbar(canvas_container, orient="vertical", command=self.canvas.yview)
        self.scrollable_frame = tk.Frame(self.canvas, bg=COLOR_BG)

        self.scrollable_frame.bind(
            "<Configure>",
            lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all"))
        )

        self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw")
        self.canvas.configure(yscrollcommand=scrollbar.set)

        self.canvas.pack(side="left", fill="both", expand=True)
        scrollbar.pack(side="right", fill="y")
        
        # Inicializa conteúdo conforme idioma atual
        self._apply_language()
        self._populate_faq()

    def _normalize(self, text: str) -> str:
        """Normaliza texto para busca (lower + sem acentos)."""
        import unicodedata
        if not isinstance(text, str):
            text = str(text or "")
        text = text.lower()
        return "".join(
            c for c in unicodedata.normalize("NFD", text)
            if unicodedata.category(c) != "Mn"
        )

    def _get_theme_rules(self, lang: str):
        """Palavras-chave por tema para ordenar o FAQ."""
        if lang == "pt":
            return [
                ["calibration", "calibracao", "correca", "tag padrao", "1 mhz", "5 mhz"],
                ["threshold", "reader power tag threshold", "module power tag threshold", "0,5 dbm", "0.5 dbm", "zoom", "pan"],
                ["licenca", "license", "token", "register license", "import license", "export license", "reload information", "expiracao", "serial", "firmware", "hardware version", "software version", "powrange", "freqrange"],
                ["noise", "ruido", "antenna check", "antena", "vswr", "temperatura", "check antenna", "fail antenna failure"],
                ["projeto", "project", "tag", "epc", "rssi", "register new tags", ".json", "description", "start search", "duplicad", "registrar"],
                ["pdf", "relatorio", "report", "export", "import", "pasta", "arquivo", "open", "site", "www.getfasttag.com"],
            ]
        return [
            ["calibration", "correction", "standard tag", "1 mhz", "5 mhz"],
            ["threshold", "reader power tag threshold", "module power tag threshold", "0.5 dbm", "zoom", "pan"],
            ["license", "token", "register license", "import license", "export license", "reload information", "expiration", "serial", "firmware", "hardware version", "software version", "powrange", "freqrange"],
            ["noise", "antenna check", "antenna", "vswr", "temperature", "check antenna", "fail antenna failure"],
            ["project", "tag", "epc", "rssi", "register new tags", ".json", "description", "start search", "duplicate", "register"],
            ["pdf", "report", "export", "import", "folder", "file", "open", "www.getfasttag.com"],
        ]

    def _theme_priority(self, question: str, answer: str, lang: str) -> int:
        """Retorna prioridade de tema para ordenar perguntas."""
        haystack = self._normalize(f"{question} {answer}")
        for idx, keywords in enumerate(self._get_theme_rules(lang)):
            for key in keywords:
                if self._normalize(key) in haystack:
                    return idx
        return 99

    def _theme_label(self, theme_idx: int, lang: str) -> str:
        """Rótulo exibido ao lado da pergunta conforme o tema."""
        labels_pt = {
            0: "Calibration",
            1: "Threshold",
            2: "Licenca",
            3: "Hardware",
            4: "Tags/Projetos",
            5: "Relatorios",
            99: "Geral",
        }
        labels_en = {
            0: "Calibration",
            1: "Threshold",
            2: "License",
            3: "Hardware",
            4: "Tags/Projects",
            5: "Reports",
            99: "General",
        }
        labels = labels_pt if lang == "pt" else labels_en
        return labels.get(theme_idx, labels[99])

    def _sort_faq_by_theme(self, data, lang: str):
        """Ordena FAQ por tema, preservando ordem original dentro de cada tema."""
        indexed_data = list(enumerate(data))
        indexed_data.sort(key=lambda item: (self._theme_priority(item[1][0], item[1][1], lang), item[0]))
        return [faq_item for _, faq_item in indexed_data]

    def _populate_faq(self, filter_term=""):
        """Limpa e recria a lista de itens do FAQ com base em um filtro."""
        for widget in self.scrollable_frame.winfo_children():
            widget.destroy()
            
        term = self._normalize(filter_term)
        
        items_found = False
        for idx, (q, a) in enumerate(self.faq_data, start=1):
            idx_text = f"{idx:02d}"
            current_lang = getattr(self, "current_lang", "en")
            theme_idx = self._theme_priority(q, a, current_lang)
            theme_label = self._theme_label(theme_idx, current_lang)
            if (
                term in self._normalize(q)
                or term in self._normalize(a)
                or term in idx_text
                or term in self._normalize(theme_label)
            ):
                numbered_question = f"[{theme_label}] {idx_text}. {q}"
                item = AccordionItem(self.scrollable_frame, question=numbered_question, answer=a)
                item.pack(fill="x", expand=True, padx=10, pady=2)
                items_found = True
        
        if not items_found:
             tk.Label(self.scrollable_frame, text=self.no_results_text, font=FONT_ANSWER, bg=COLOR_BG).pack()

        self._bind_mousewheel_recursively(self.scrollable_frame)

    def _filter_faq(self, *args):
        """Função chamada sempre que o texto de busca muda."""
        search_term = self.search_var.get()
        self._populate_faq(filter_term=search_term)

    def _on_mousewheel(self, event):
        self.canvas.yview_scroll(int(-1 * (event.delta / 120)), "units")

    def _bind_mousewheel_recursively(self, widget):
        widget.bind("<MouseWheel>", self._on_mousewheel)
        for child in widget.winfo_children():
            self._bind_mousewheel_recursively(child)

    def _apply_language(self):
        """Atualiza textos e base de FAQ conforme o idioma atual."""
        lang = None
        if self.translator:
            try:
                lang = self.translator.get_language()
            except Exception:
                lang = None
        if lang not in ("pt", "en"):
            lang = "en"

        if lang == "pt":
            self.current_lang = "pt"
            self.faq_data = self._sort_faq_by_theme(self.faq_data_pt, "pt")
            self.title_label.config(text="FAQ / Ajuda")
            self.search_label.config(text="Buscar:")
            self.no_results_text = "Nenhum resultado encontrado."
        else:
            self.current_lang = "en"
            self.faq_data = self._sort_faq_by_theme(self.faq_data_en, "en")
            self.title_label.config(text="FAQ / Help")
            self.search_label.config(text="Search:")
            self.no_results_text = "No results found."

    def refresh_language(self):
        """Contrato com app_shell: reaplica textos e repovoa a lista quando o idioma muda."""
        self._apply_language()
        current_term = self.search_var.get() if hasattr(self, "search_var") else ""
        self._populate_faq(filter_term=current_term)

    def destroy(self):
        super().destroy()

# --- Bloco de Teste Isolado ---
if __name__ == '__main__':
    root = tk.Tk()
    root.title("Teste - Tela de FAQ")
    root.geometry("950x750")
    
    faq_app = FaqScreen(root)
    
    root.mainloop()