# -*- coding:utf-8 -*-

import ollama
import time


start_time = time.time()

# 定义输入信息变量
# msg = "对少数地区确需使用土地利用总体规划确定的城市建设用地范围外的土地，使用未列入耕地后备资源且尚未确定土地使用权人（或承包经营权人）的国有沙地、裸土地、裸岩石砾地的工业项目用地，在天涯区选取一个面积为100-120亩作为工业用地，要求与永久基本农田不重叠，且位于城镇开发边界内，与生态保护红线、文化保护区、自然保护地、风景名胜区、国有使用权等不重叠，距离小学大于5km，距离高压线超过10km,距离古树10km以外，距离变电站小于20km，工业项目必须依法申请使用土地利用总体规划确定的城市建设用地范围内的国有建设用地。"
# prompt = "我计划在抱坡区选取适宜地块作为工业用地，要求其在城市开发边界内，离小学大于1000m,坡度小于25度，用地面积在80-100亩之间。"


context = "你是一个智能助手，现在和用户讨论选址要求"
# msg = "222"
# prompt = "离医院太近了，改为1000米"

# 生成提示信息
sys = f"""请扮演文本提取工具，根据输入和聊天上下文信息,基于以下因子选择、选址范围和用地类型提取这句话中的关键信息，提取到的结果请严格将json格式字符串输出并保障寄送格式正确无误，如果没有提取到相关数据则不用以json格式字符串进行输出，只输出提示："未找到相关数据"。
选址范围 = ['抱坡区','天涯区','崖州区','海棠区','吉阳区' ],
因子选择 = ["高程","坡度","永久基本农田","城镇开发边界内","生态保护红线","文化保护区","自然保护地","风景名胜区","国有使用权","河道管理线","水库","公益林","火葬场","垃圾处理场","污水处理场","高压线","变电站","古树","城市道路","主要出入口","文化活动设施","体育运动场所","排水","供水","燃气","电力","电信","十五分钟社区生活圈邻里中心","社区服务设施","零售商业场所","医疗卫生设施","幼儿园服务半径","小学服务半径","为老服务设施"]
用地类型=['园地', '耕地', '林地', '草地', '湿地', '公共卫生用地', '老年人社会福利用地', '儿童社会福利用地', '残疾人社会福利用地', '其他社会福利用地', '零售商业用地', '居住用地','批发市场用地', '餐饮用地', '旅馆用地', '公用设施营业网点用地', '娱乐用地', '康体用地', '一类工业用地', '二类工业用地', '广播电视设施用地', '环卫用地', '消防用地', '干渠', '水工设施用地', '其他公用设施用地', '公园绿地', '防护绿地', '广场用地', '军事设施用地', '使领馆用地', '宗教用地', '文物古迹用地', '监教场所用地', '殡葬用地', '其他特殊用地', '河流水面', '湖泊水面', '水库水面', '坑塘水面', '沟渠', '冰川及常年积雪', '渔业基础设施用海', '增养殖用海', '捕捞海域', '工业用海', '盐田用海', '固体矿产用海', '油气用海', '可再生能源用海', '海底电缆管道用海', '港口用海', '农业设施建设用地', '耕地', '园地', '林地', '工矿用地', '畜禽养殖设施建设用地', '水产养殖设施建设用地', '城镇住宅用地', '草地', '湿地', '留白用地', '陆地水域', '游憩用海', '特殊用海', '特殊用地', '其他海域',  '绿地与开敞空间用地', '水田', '水浇地', '旱地', '果园', '茶园', '橡胶园', '其他园地', '乔木林地', '竹林地', '城镇社区服务设施用地', '农村宅基地', '农村社区服务设施用地', '机关团体用地', '科研用地', '文化用地', '教育用地', '体育用地', '医疗卫生用地', '社会福利用地', '商业用地', '商务金融用地', '二类农村宅基地', '图书与展览用地', '文化活动用地', '高等教育用地', '中等职业教育用地', '体育训练用地', '其他交通设施用地', '供水用地', '排水用地', '供电用地', '供燃气用地', '供热用地', '通信用地', '邮政用地', '医院用地', '基层医疗卫生设施用地', '田间道', '盐碱地', '沙地', '裸土地', '裸岩石砾地', '村道用地', '村庄内部道路用地', '渔业用海', '工矿通信用海', '其他土地', '公共管理与公共服务用地', '仓储用地', '交通运输用地', '公用设施用地', '交通运输用海', '航运用海', '路桥隧道用海', '风景旅游用海', '文体休闲娱乐用海', '军事用海', '其他特殊用海', '空闲地', '田坎', '港口码头用地', '管道运输用地', '城市轨道交通用地', '城镇道路用地', '交通场站用地', '一类城镇住宅用地', '二类城镇住宅用地', '三类城镇住宅用地', '一类农村宅基地', '商业服务业用地', '三类工业用地', '一类物流仓储用地', '二类物流仓储用地', '三类物流仓储用地', '盐田', '对外交通场站用地', '公共交通场站用地', '社会停车场用地', '中小学用地', '幼儿园用地', '其他教育用地', '体育场馆用地', '灌木林地', '其他林地', '天然牧草地', '人工牧草地', '其他草地', '森林沼泽', '灌丛沼泽', '沼泽草地', '其他沼泽地', '沿海滩涂', '内陆滩涂', '红树林地', '乡村道路用地', '种植设施建设用地', '娱乐康体用地', '其他商业服务业用地', '工业用地', '采矿用地', '物流仓储用地', '储备库用地', '铁路用地', '公路用地', '机场用地']
landType是用地类型
districtName是选址范围
area是用地大小，单位统一转换为亩
factors是因子选择
其他公里、千米的单位转换为米
json格式数据如下：
{{
    "districtName": "抱坡区",
    "landType": "居住用地",
    "area": {{
        "min": 30,
        "max": 50
    }},
    "factors": [
        {{
            "type": "医疗卫生设施",
            "condition": "lt",
            "value": "500"
        }},
        {{
            "type": "永久基本农田",
            "condition": "not_intersect"
        }},
        {{
            "type": "火葬场",
            "condition": "gt",
            "value": "1000"
        }}，
        {{
            "type": "幼儿园服务半径",
            "condition": "lt",
            "value": "1000"
        }}，
        {{
            "type": "小学服务半径",
            "condition": "lt",
            "value": "1000"
        }}，
    ]
}}
json中"condition"的值为"gt"、"lt"、"get"、"let"、"between","not_intersect"、"intersect"、"not_contain"、"contain"、"between"  
"""
# json中"condition"的值为"gt"、"lt"、"get"、"let"、"between","not_intersect"、"intersect"、"not_contain"、"contain"、"between"  
# 并把json中"condition"的值"不相交"、 "相交"、"不包含"、"包含"、"介于"分别替换为"not_intersect"、"intersect"、"not_contain"、"contain"、"between"
# 并把json中"type"的值与因子选择中的因子语义相近，有重复字段的保持与因子选择中的名称一致，如医院转换为医疗卫生设施，如果因子选择中的因子名称与json中的"type"的值不一致，需进行转换，如医院转换为医疗卫生设施
# 初始化聊天上下文列表
chat_history = "用户：你好，我是智能助手，请问有什么可以帮助您？\\n智能助手：好的，请问您有什么需求？"

def update_chat_history(user_message):
    global chat_history  # 使用全局变量以便更新
    prompt = chat_history + "\\n用户：" + user_message

    # 生成回复，并加入聊天上下文
    res = ollama.generate(
        model="qwen2:7b",
        stream=False,
        system=sys,
        prompt=prompt,
        options={"temperature": 0, "num_ctx": 32000,},
        keep_alive=-1
    )
    
    # 获取机器人回复
    bot_message = res["response"]
    
    # 更新聊天历史
    chat_history += "\\n智能助手：" + bot_message
    
    # 返回机器人的回复
    return bot_message

# 示例：用户输入一条消息
user_message = "我计划在抱坡区选取适宜地块作为工业用地，要求其在城市开发边界内，离小学大于1000m,坡度小于25度，用地面积在80-100亩之间。"
response = update_chat_history(user_message)
print(response)  # 打印生成的回复



end_time = time.time()
# 计算时间差
elapsed_time = end_time - start_time

print(f"耗时: {elapsed_time} 秒")
# res1 = res["response"].replace("大于","gt").replace("小于","lt").replace("大于等于","get").replace("小于等于","let").replace("介于","between")
# print(res1)
