# -*- coding: utf-8 -*-
"""Woman Walking, Brief Description

Automatically generated by Colab.

Original file is located at
    https://colab.research.google.com/drive/1Xk_0oTqcX9vurpNoIJfPEdVegyeDSy7q

# Generated Code
"""

!pip install -U -q "google"
!pip install -U -q "google.genai"

import sys
import base64
from google import genai
from google.genai import types
import os
from google.colab import userdata
from google.colab import drive
from PIL import Image
import matplotlib.pyplot as plt
import textwrap
import time
from IPython.display import display, HTML
import re

drive.mount('/content/drive')
os.environ["GEMINI_API_KEY"] = userdata.get("GOOGLE_API_KEY")

image_path = '/content/drive/MyDrive/Google AI Studio/w1.png'


def format_text_for_colab(text, width=80):
    """Formata texto longo para melhor visualização no Colab"""
    # Remove espaços extras
    text = re.sub(r'\s+', ' ', text.strip())

    # Quebra o texto em linhas de tamanho adequado
    wrapped_lines = textwrap.fill(text, width=width)
    return wrapped_lines


def print_formatted_response(text, title="RESPOSTA", stream=False, delay=0.03):
    """Imprime resposta formatada com opção de streaming"""
    print("\n" + "=" * 80)
    print(f"📝 {title}")
    print("=" * 80)

    if stream:
        # Efeito de digitação
        for char in text:
            print(char, end='', flush=True)
            time.sleep(delay)
        print()
    else:
        # Imprime o texto formatado
        formatted_text = format_text_for_colab(text, width=75)
        print(formatted_text)

    print("\n" + "=" * 80)


def print_section_header(title, icon="🔍"):
    """Imprime cabeçalho de seção formatado"""
    print(f"\n{icon} {title}")
    print("-" * (len(title) + 4))


def mostrar_imagem():
    try:
        image = Image.open(image_path)
        print(f"✅ Imagem carregada com sucesso: {image_path}")
        plt.figure(figsize=(12, 8))
        plt.imshow(image)
        plt.axis('off')
        plt.title('Imagem a ser analisada', fontsize=14, pad=20)
        plt.tight_layout()
        plt.show()

        # Informações da imagem
        print(f"📊 Dimensões: {image.size[0]} x {image.size[1]} pixels")
        print(f"📋 Formato: {image.format}")

        # Sleep para garantir que a imagem foi totalmente renderizada
        time.sleep(2)

    except FileNotFoundError:
        print(f"❌ Erro: Arquivo de imagem não encontrado em {image_path}")
    except Exception as e:
        print(f"❌ Erro ao abrir a imagem: {e}")


def generate():
    """Gera descrição única da imagem com formatação aprimorada"""
    try:
        with open(image_path, 'rb') as f:
            image_data = f.read()

        client = genai.Client(api_key=os.environ.get("GEMINI_API_KEY"))
        model = "gemini-2.0-flash-exp"

        contents = [
            types.Content(
                role="user",
                parts=[
                    types.Part.from_bytes(
                        data=image_data,
                        mime_type="image/png"
                    ),
                    types.Part.from_text(text="""Descreva esta imagem em detalhes, incluindo:
                    1. Objetos e elementos principais
                    2. Cores predominantes
                    3. Pessoas (se houver)
                    4. Cenário e ambiente
                    5. Detalhes relevantes e interessantes

                    Organize a resposta de forma clara e estruturada.""")
                ],
            ),
        ]

        generate_content_config = types.GenerateContentConfig(
            response_mime_type="text/plain",
            system_instruction=[
                types.Part.from_text(text="Você é um assistente especializado em descrição detalhada de imagens. Seja preciso, detalhado e organize suas respostas de forma clara."),
            ],
        )

        print_section_header("ANÁLISE DETALHADA DA IMAGEM", "🔍")
        print("⏳ Gerando descrição...")

        # Coleta a resposta completa primeiro
        full_response = ""
        for chunk in client.models.generate_content_stream(
            model=model,
            contents=contents,
            config=generate_content_config,
        ):
            full_response += chunk.text

        # Exibe a resposta formatada
        print_formatted_response(full_response, "DESCRIÇÃO DA IMAGEM")

    except Exception as e:
        print(f"❌ Erro ao gerar descrição: {e}")


def chat_with_image():
    """Chat interativo com formatação aprimorada"""
    try:
        with open(image_path, 'rb') as f:
            image_data = f.read()
    except FileNotFoundError:
        print(f"❌ Erro: Arquivo de imagem não encontrado em {image_path}")
        return
    except Exception as e:
        print(f"❌ Erro ao abrir a imagem: {e}")
        return

    try:
        client = genai.Client(api_key=os.environ.get("GEMINI_API_KEY"))
        model = "gemini-2.0-flash-exp"
    except Exception as e:
        print(f"❌ Erro ao configurar a API: {e}")
        return

    print("\n" + "=" * 80)
    print("🤖 CHAT INTERATIVO COM IMAGEM")
    print("=" * 80)
    print("💡 Você pode fazer perguntas sobre a imagem carregada.")
    print("🚪 Digite 'sair', 'quit' ou 'exit' para encerrar o chat.")
    print("=" * 80)

    conversation_history = []
    question_count = 0

    while True:
        try:
            print(f"\n{'─' * 80}")

            # Sleep e flush para garantir renderização
            time.sleep(0.3)
            sys.stdout.flush()

            print(f"🧑 Pergunta #{question_count + 1}: ", end="")
            sys.stdout.flush()

            user_input = input().strip()

            if user_input.lower() in ['sair', 'quit', 'exit', 'tchau']:
                print("\n👋 Chat encerrado. Até mais!")
                break

            if user_input.lower() == 'limpar':
                conversation_history.clear()
                question_count = 0
                print("🧹 Histórico de conversa limpo!")
                continue

            if not user_input:
                print("⚠️  Por favor, digite uma pergunta ou comando.")
                continue

            question_count += 1
            conversation_history.append(f"Usuário: {user_input}")

            # Limita o histórico para evitar contexto muito longo
            context_history = conversation_history[-8:]  # Últimas 8 interações
            context = "Histórico da conversa:\n" + "\n".join(context_history) + f"\n\nPergunta atual: {user_input}"

            contents = [
                types.Content(
                    role="user",
                    parts=[
                        types.Part.from_bytes(
                            data=image_data,
                            mime_type="image/png"
                        ),
                        types.Part.from_text(text=context)
                    ],
                ),
            ]

            generate_content_config = types.GenerateContentConfig(
                response_mime_type="text/plain",
                system_instruction=[
                    types.Part.from_text(text="""Você é um assistente especializado em análise de imagens.
                    Responda às perguntas do usuário sobre a imagem de forma clara, detalhada e bem estruturada.
                    Mantenha o contexto da conversa anterior. Seja preciso e útil."""),
                ],
            )

            print("\n⏳ Pensando na resposta...")

            # Coleta a resposta completa
            response_text = ""
            for chunk in client.models.generate_content_stream(
                model=model,
                contents=contents,
                config=generate_content_config,
            ):
                response_text += chunk.text

            # Exibe a resposta formatada
            print_formatted_response(response_text, f"RESPOSTA #{question_count}")

            conversation_history.append(f"Assistente: {response_text}")

        except KeyboardInterrupt:
            print("\n\n👋 Chat interrompido. Até mais!")
            break
        except Exception as e:
            print(f"\n❌ Erro durante o chat: {e}")
            print("🔄 Tente novamente ou digite 'sair' para encerrar.")


def show_help():
    """Exibe ajuda sobre como usar o programa"""
    help_text = """
    📖 GUIA DE USO:

    🔍 Opção 1 - Descrição Única:
    • Gera uma análise detalhada e completa da imagem
    • Ideal para obter uma visão geral dos elementos presentes

    💬 Opção 2 - Chat Interativo:
    • Permite fazer perguntas específicas sobre a imagem
    • Mantém contexto da conversa
    • Digite 'limpar' para resetar o histórico
    • Use 'sair' para encerrar

    💡 Dicas:
    • Seja específico em suas perguntas
    • Pergunte sobre detalhes, cores, objetos, pessoas, etc.
    • O assistente mantém o contexto da conversa

    ⚡ Comandos especiais no chat:
    • 'sair' / 'quit' / 'exit' - Encerra o chat
    • 'limpar' - Limpa o histórico da conversa
    """
    print(help_text)


def menu():
    print("\n" + "=" * 80)
    print("🖼️  ANÁLISE DE IMAGEM COM GEMINI - VERSÃO APRIMORADA")
    print("=" * 80)
    print("1. 🔍 Gerar descrição única da imagem")
    print("2. 💬 Iniciar chat interativo sobre a imagem")
    print("3. 💡 Ajuda e instruções de uso")
    print("4. 🚪 Sair")
    print("=" * 80)

    while True:
        try:
            # Sleep adicional para garantir que tudo foi renderizado
            time.sleep(0.5)

            # Força a saída e aguarda um pouco
            sys.stdout.flush()
            time.sleep(0.2)

            print("\n📋 Escolha uma opção (1-4): ", end="")
            sys.stdout.flush()

            choice = input().strip()

            if choice == '1':
                generate()
                print("\n⏸️  Pressione Enter para voltar ao menu...", end="")
                sys.stdout.flush()
                input()
                break
            elif choice == '2':
                chat_with_image()
                print("\n⏸️  Pressione Enter para voltar ao menu...", end="")
                sys.stdout.flush()
                input()
                break
            elif choice == '3':
                show_help()
                print("\n⏸️  Pressione Enter para voltar ao menu...", end="")
                sys.stdout.flush()
                input()
                continue
            elif choice == '4':
                print("👋 Até mais!")
                break
            else:
                print("❌ Opção inválida. Digite 1, 2, 3 ou 4.")

        except KeyboardInterrupt:
            print("\n👋 Programa encerrado.")
            break


if __name__ == "__main__":
    if not os.environ.get("GEMINI_API_KEY"):
        print("❌ Erro: Variável de ambiente GEMINI_API_KEY não está configurada.")
        print("🔧 Configure a chave da API no Google Colab Secrets.")
    else:
        print("🚀 Inicializando sistema...")
        mostrar_imagem()  # Mostra a imagem automaticamente
        menu()