import logging
import json
from transformers import pipeline
from obsei_module.obsei.payload import TextPayload
from obsei_module.obsei.analyzer.classification_analyzer import ZeroShotClassificationAnalyzer, ClassificationAnalyzerConfig
from obsei_module.obsei.source.website_crawler_source import TrafilaturaCrawlerConfig, TrafilaturaCrawlerSource
from obsei_module.obsei.sink.http_sink import HttpSinkConfig, HttpSink
from obsei_module.obsei.analyzer.sentiment_analyzer import *
import connect_mongo
import pymongo


async def get_object_by_link(db_name, collection_name, link):
    collection = connect_mongo.connect_to_mongo(db_name, collection_name)
    
    if collection is None:
        print("Failed to connect to MongoDB.")
        return None

    result = collection.find_one({"link": link})
    
    # if result:
    #     print(f"Object found: {result}")
    # else:
    #     print(f"No object found for the link: {link}")
    
    return result


# Hàm kết nối và kiểm tra bản ghi trong DB khác
async def get_existing_record_by_name(db_name, collection_name, name, link):
    collection = connect_mongo.connect_to_mongo(db_name, collection_name)
    
    if collection is None:
        print("Failed to connect to MongoDB.")
        return None

    # Kiểm tra bản ghi có cùng name và link hay không
    result = collection.find_one({"name": name, "link": link})
    
    # if result:
    #     print(f"Existing record found for name: {name} and link: {link}")
    # else:
    #     print(f"No existing record found for name: {name} and link: {link}")
    
    return result

# Hàm lưu processed_text vào MongoDB với kiểm tra name
async def save_processed_text_to_mongo(db_name, collection_name, link, processed_text, name=None):
    collection = connect_mongo.connect_to_mongo(db_name, collection_name)

    if collection is None:
        print("Failed to connect to MongoDB.")
        return None

    # Tạo bản ghi mới hoặc cập nhật bản ghi cũ
    document = {
        "link": link,
        "processed_text": processed_text,
        "name": name,  # Thêm name cho bản ghi mới
    }

    

    # Kiểm tra sự tồn tại của bản ghi trong DB dự phòng
    existing_record = await get_existing_record_by_name(db_name, collection_name, name, link)
    
    if existing_record:
        # Nếu bản ghi tồn tại, cập nhật
        result = collection.update_one(
            {"_id": existing_record["_id"]},
            {
                "$set": document
            }
        )
        if result.modified_count > 0:
            print(f"Successfully updated the record for {link}.")
        else:
            print(f"No changes made to the record for {link}.")
    else:
        # Nếu bản ghi chưa tồn tại, tạo mới
        result = collection.insert_one(document)
        print(f"Successfully inserted a new record for {link}.")
    
    return result

# Hàm xử lý URL, lấy dữ liệu, phân tích và lưu processed_text vào MongoDB
async def process_url(url: str, db_name: str, collection_name: str,backup_db_name: str, backup_collection_name: str):
    """Crawl data from the URL and analyze it with a Zero-shot classification model."""
    logging.basicConfig(level=logging.INFO)
    logger = logging.getLogger(__name__)

    # Bước 1: Crawl dữ liệu từ URL
    crawler_config = TrafilaturaCrawlerConfig(
        urls=[url]
    )
    crawler = TrafilaturaCrawlerSource()

    crawled_data = crawler.lookup(config=crawler_config)
    if not crawled_data:
        logger.error("No data found from crawler")
        return {"error": "No data found from crawler"}
    

    # Bước 2: Cấu hình phân tích với Zero-shot classification
    analyzer_config = ClassificationAnalyzerConfig(
        labels=["Sports", "Politics", "Technology", "Entertainment"],
        multi_class_classification=False,
        add_positive_negative_labels=False
    )

    analyzer = ZeroShotClassificationAnalyzer(
        model_name_or_path="facebook/bart-large-mnli",
        device="auto"
    )

    # Phân tích dữ liệu crawled_data
    analysis_results = analyzer.analyze_input(
        source_response_list=crawled_data,
        analyzer_config=analyzer_config
    )
#     transformers_analyzer_config = TransformersSentimentAnalyzerConfig(
#     labels=["positive", "negative"],
#     multi_class_classification=False,
#     add_positive_negative_labels=True
# )
    # transformers_analyzer = TransformersSentimentAnalyzer(model_name_or_path="facebook/bart-large-mnli", device="auto")
    # transformers_results = transformers_analyzer.analyze_input(crawled_data, analyzer_config=transformers_analyzer_config)

    # Cấu hình HttpSink (nếu cần gửi dữ liệu đi nơi khác)
    http_sink_config = HttpSinkConfig(
        url="https://httpbin.org/post", 
        headers={"Content-type": "application/json"},
        base_payload={"common_field": "test cua VNY"},
    )

    http_sink = HttpSink()

    responses = http_sink.send_data(analysis_results, http_sink_config)

    response_data = []
    for i, response in enumerate(responses):
        response_content = response.read().decode("utf-8")
        response_json = json.loads(response_content)
        
        response_data.append({
            "response_index": i + 1,
            "content": response_json,
            "status_code": response.status,
            "headers": dict(response.getheaders())
        })

    content_data = [item["content"] for item in response_data]
    processed_text = content_data[0].get("json", {}).get('segmented_data', 'No processed text available.')
    processed_text1 = content_data[0].get("json", {})
    content_data = processed_text1.get('meta').get('text')
    existing_record = await get_object_by_link(db_name, collection_name, url)
    if existing_record:
     existing_segmented_data = existing_record.get("segmented_data", {})
     existing_segmented_data.update({"new_analysis": processed_text})
     await save_processed_text_to_mongo(backup_db_name, backup_collection_name, url, processed_text, name="Sentiment Analysis")
    else:
     await save_processed_text_to_mongo(backup_db_name, backup_collection_name, url, processed_text, name="Sentiment Analysis")

    return processed_text,content_data

# url = "https://laodong.vn/bong-da-quoc-te/vua-phat-goc-nicolas-jover-la-vo-gia-voi-arsenal-1431091.ldo"
# db_name = "test"
# import asyncio
# collection_name = "articles"
# backup_db_name = "backup_test"
# backup_collection_name = "articles_analysis"
# processed_text = asyncio.run(process_url(url, db_name, collection_name, backup_db_name, backup_collection_name))