import logging
import os
from datetime import datetime
from docx import Document
import gradio as gr
from typing import Optional  # Make sure to import Optional

# Настройка логирования
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    filename='legal_assistant.log'
)
logger = logging.getLogger(__name__)

class LegalChatService:
    def __init__(self):
        self.messages = [{
            "role": "system",
            "content": """You are an expert in Russian law. Provide accurate legal advice based on the user's question and the context of the document.""" 
        }]
            
    def get_response(self, user_input: str, context: Optional[str] = None) -> str:
        if context:
            prompt = f"Context from the document:\n{context}\n\nUser's question:\n{user_input}"
        else:
            prompt = user_input
        
        # Simulating a legal response based on the context
        response = "This is a simulated legal response based on the context provided."
        
        self.messages.append({"role": "assistant", "content": response})
        return response
            
    def get_model_response(self, prompt: str) -> str:
        # Simulating a model response here. Replace with actual API call in production
        return "This is a simulated legal response based on the context provided."

class LegalDocumentService:
    def __init__(self):
        self.chat_service = LegalChatService()
        
    def process_document(self, file_path: str, question: str) -> str:
        try:
            # Чтение документа
            doc = Document(file_path)
            text = '\n'.join([paragraph.text for paragraph in doc.paragraphs])
            
            # Получение ответа с учетом контекста документа
            return self.chat_service.get_response(question, context=text)
            
        except Exception as e:
            logger.error(f"Ошибка при обработке документа: {str(e)}")
            return f"Ошибка при обработке документа: {str(e)}"
    
    def generate_legal_document(self, prompt: str) -> str:
        try:
            # Добавляем специфичные инструкции для генерации юридического документа
            document_prompt = f"""Создайте юридический документ на основе следующего запроса:
            {prompt}
            
            Документ должен:
            1. Соответствовать российскому законодательству
            2. Содержать все необходимые реквизиты
            3. Использовать актуальные правовые формулировки
            4. Включать ссылки на законодательство"""
            
            response = self.chat_service.get_response(document_prompt)
            
            # Создание документа Word
            doc = Document()
            doc.add_heading('Юридический документ', 0)
            
            # Добавление текущей даты
            doc.add_paragraph(f'Дата создания: {datetime.now().strftime("%d.%m.%Y")}')
            
            # Добавление основного содержания
            doc.add_paragraph(response)
            
            # Сохранение документа
            filename = f"legal_doc_{datetime.now().strftime('%Y%m%d_%H%M%S')}.docx"
            filepath = os.path.join('generated_documents', filename)
            os.makedirs('generated_documents', exist_ok=True)
            
            doc.save(filepath)
            return filepath
            
        except Exception as e:
            logger.error(f"Ошибка при генерации документа: {str(e)}")
            raise

def create_gradio_interface():
    # Создание экземпляров сервисов
    legal_doc_service = LegalDocumentService()
    
    # Функция для обработки чата
    def chat_response(message, history):
        response = legal_doc_service.chat_service.get_response(message)
        return response
    
    # Функция для обработки документа
    def process_document_with_question(file, question):
        if file is None or question.strip() == "":
            return "Пожалуйста, загрузите документ и задайте вопрос."
        
        # Получаем путь к файлу и обрабатываем
        with open(file.name, "rb") as f:
            response = legal_doc_service.process_document(file.name, question)
        return response
    
    # Функция для генерации документа
    def generate_document(prompt):
        if prompt.strip() == "":
            return None
        return legal_doc_service.generate_legal_document(prompt)

    # Создание интерфейса
    with gr.Blocks() as interface:
        gr.Markdown("# Юридический ассистент")
        
        with gr.Tab("Чат с юристом"):
            chatbot = gr.ChatInterface(
                chat_response,
                chatbot=gr.Chatbot(height=400),
                textbox=gr.Textbox(placeholder="Задайте вопрос по юридической теме...", container=False),
                title="Консультация с юристом",
            )
        
        with gr.Tab("Анализ документов"):
            with gr.Row():
                file_input = gr.File(label="Загрузите документ Word")
                question_input = gr.Textbox(label="Задайте вопрос по документу")
            analyze_btn = gr.Button("Проанализировать")
            output = gr.Textbox(label="Ответ системы")
            analyze_btn.click(
                process_document_with_question,
                inputs=[file_input, question_input],
                outputs=output
            )
        
        with gr.Tab("Генерация документов"):
            doc_prompt = gr.Textbox(
                label="Опишите, какой документ нужно создать",
                placeholder="Например: Составьте договор аренды квартиры..."
            )
            generate_btn = gr.Button("Создать документ")
            doc_output = gr.File(label="Сгенерированный документ")
            generate_btn.click(
                generate_document,
                inputs=doc_prompt,
                outputs=doc_output
            )

    return interface

if __name__ == "__main__":
    # Создаём и запускаем интерфейс на порту 7861
    interface = create_gradio_interface()
    interface.launch(share=False, server_name="127.0.0.1", server_port=7861)


Исправь мой код, он просто отвечает "This is a simulated legal response based on the context provided." и все, никаких ответов, укажи модель  gpt4 в g4f