from langchain_community.document_loaders import PyPDFLoader
from langchain_community.chat_models.oci_generative_ai import ChatOCIGenAI
from langchain_core.prompts import PromptTemplate
from langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import RunnablePassthrough
from langchain_community.embeddings import OCIGenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_community.vectorstores import FAISS

def chat():

    caminhos_pdf = [    './Manuals/using-integrations-oracle-integration-3.pdf',
                        './Manuals/SOASUITE.pdf',
                        './Manuals/SOASUITEHL7.pdf'
                        ]

    pages = []
    ids = []
    counter = 1
    for caminho_pdf in caminhos_pdf:
        doc_pages = PyPDFLoader(caminho_pdf).load_and_split()

        pages.extend(doc_pages)
        ids.append(str(counter))
        counter = counter + 1

    llm = ChatOCIGenAI(
        model_id="meta.llama-3.1-405b-instruct",
        service_endpoint="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com",
        compartment_id="ocid1.compartment.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
        auth_profile="DEFAULT",  # replace with your profile name,
        model_kwargs={"temperature": 0.7, "top_p": 0.75, "max_tokens": 1000},
    )

    embeddings = OCIGenAIEmbeddings(
        model_id="cohere.embed-multilingual-v3.0",
        service_endpoint="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com",
        compartment_id="ocid1.compartment.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
        auth_profile="DEFAULT",  # replace with your profile name
    )

    vectorstore = FAISS.from_documents(
        pages,
        embedding=embeddings
    )
    retriever = vectorstore.as_retriever()

    #### YOU CAN PERSIST YOUR VECTOR STORE HERE

    template = """ 
        If the query in question is not a comparison between SOA SUITE and OIC, consider only the documents relevant to the subject,
         that is, if the question is about SOA SUITE, consider only the SOA SUITE documents. If the question is about OIC,
          consider only the OIC document. If the question is a comparison between SOA SUITE and OIC, consider all documents. 
          Inform at the beginning which tool is being discussed    : {input} 
    """
    prompt = PromptTemplate.from_template(template)


    chain = (
            {"context": retriever,
             "input": RunnablePassthrough()}
            | prompt
            | llm
            | StrOutputParser()
    )

    while (True):
        query = input()
        if query == "quit":
            break
        print(chain.invoke(query))


chat()

