import pandas as pd
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai.chat_models import ChatOpenAI


def get_session_history(session_id: str) -> BaseChatMessageHistory:
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]


def read_txt_file(file_path: str) -> str:
    with open(file_path, "r", encoding='ISO-8859-1') as file:
        content = file.read()
    return content


def read_csv_file(file_path: str) -> pd.DataFrame:
    return pd.read_csv(file_path)


def format_csv_data(df: pd.DataFrame, start: int, end: int) -> str:
    formatted_data = []
    for index, row in df.iloc[start:end].iterrows():
        formatted_data.append(
            f"时刻{index + 1}: Sp={row['price']}, Sl={row['load']},"
            f"St={row['temperature']}, Si={row['irradiance']}, Sw={row['wind_speed']}"
        )
    return "\n".join(formatted_data)


system_content = read_txt_file('./llm.txt')
df = read_csv_file('./data.csv')
llm = ChatOpenAI(
    streaming=True,
    verbose=True,
    openai_api_key="none",
    # openai_api_base="http://0.0.0.0:5049/v1/models",
    openai_api_base="http://0.0.0.0:8501",
    model_name="Qwen1.5-32b"
)
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system_content,),
        MessagesPlaceholder(variable_name="history"),
        ("human", "{input}"),
    ]
)
runnable = prompt | llm
store = {}
with_message_history = RunnableWithMessageHistory(
    runnable,
    get_session_history,
    input_messages_key="input",
    history_messages_key="history",
)

num_hours = len(df)
for i in range(num_hours):
    start = i
    end = start + 1
    csv_data_chunk = format_csv_data(df, start, end)

    result = with_message_history.invoke(
        {"input": f"数据如下：\n{csv_data_chunk}"},
        config={
            "configurable": {"session_id": "cxd"}
        },
    )
    print(f"Hour {i + 1}:\n{result.content}\n")
