import json
from typing import Dict, List, Tuple

from loguru import logger

from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import (
    TencentCloudSDKException,
)
from tencentcloud.nlp.v20190408 import models, nlp_client

from app.core.config import settings


def get_tencent_nlp_client() -> nlp_client.NlpClient:
    try:
        cred = credential.Credential(
            settings.TENCENT_SECRET_ID_V1, settings.TENCENT_SECRET_KEY_V1
        )
        http_profile = HttpProfile()
        http_profile.reqMethod = "GET"
        http_profile.endpoint = settings.TENCENT_NLP_ENDPOINT

        client_profile = ClientProfile()
        client_profile.httpProfile = http_profile
        client = nlp_client.NlpClient(cred, "ap-guangzhou", client_profile)

        return client
    except TencentCloudSDKException as e:
        logger.error(e)


class TencentNLP:
    def __init__(self):
        cred = credential.Credential(
            settings.TENCENT_SECRET_ID_V1, settings.TENCENT_SECRET_KEY_V1
        )
        http_profile = HttpProfile()
        http_profile.reqMethod = "GET"
        http_profile.endpoint = settings.TENCENT_NLP_ENDPOINT

        client_profile = ClientProfile()
        client_profile.httpProfile = http_profile
        client = nlp_client.NlpClient(cred, "ap-guangzhou", client_profile)
        self.client = client

    async def get_lexical_analysis_result(self, text: str) -> Tuple[List, List]:
        req = models.LexicalAnalysisRequest()
        params = {"Text": text}
        req.from_json_string(json.dumps(params))
        resp = self.client.LexicalAnalysis(req)

        return resp.PosTokens, resp.NerTokens

    async def get_auto_summarization_result(self, text: str) -> str:
        req = models.AutoSummarizationRequest()
        params = {"Text": text}
        req.from_json_string(json.dumps(params))
        resp = self.client.AutoSummarization(req)

        return resp.Summary

    async def get_text_similarity_result(
        self, src_text: str, target_text: List[str]
    ) -> List:
        req = models.TextSimilarityRequest()
        params = {"SrcText": src_text, "TargetText": target_text}
        req.from_json_string(json.dumps(params))
        resp = self.client.TextSimilarity(req)

        return resp.Similarity

    async def get_dependency(self, text: str) -> List:
        req = models.DependencyParsingRequest()
        params = {"Text": text}
        req.from_json_string(json.dumps(params))
        resp = self.client.DependencyParsing(req)

        return resp.DpTokens

    async def get_word_similarity(self, src_word: str, target: str) -> float:
        try:
            req = models.WordSimilarityRequest()
            params = {"SrcWord": src_word, "TargetWord": target}
            req.from_json_string(json.dumps(params))
            resp = self.client.WordSimilarity(req)
        except TencentCloudSDKException:
            return 0

        return resp.Similarity