from typing import List

from transformers import BertForQuestionAnswering, BertForTokenClassification

from triton_bert.triton_bert import TritonBert
import numpy as np
import tensorflow as tf

class MRC(TritonBert):
    '''
    rank with text similarity
    '''
    def __init__(self, triton_host:str, model: str, vocab:str, **kwargs):
        super().__init__(triton_host=triton_host, model=model, vocab=vocab, **kwargs)


        self.PRESSURE_LABEL_2_QUESTION = {
            '一次性结清': '是否催收员提到了一次性全额结清话术，强调不还款会要求后面一次性把钱还清，被要求连本带息归还全款，被要求一次性结清等？',
            '三方施压': '是否催收员使用第三方进行催收话术，强调会找亲人进行催收，你家人知道你欠款不还吗，我们会打电话给你亲人等？',
            '上门催收': '是否催收员使用上门催收相关话术，强调不排除我们将上门催收，可能对户籍地进行拜访和调查，移交当地分行上访，进行外访等？',
            '停卡警示': '是否催收员提到了停卡话术，强调后续可能被停卡，被锁卡，一旦停卡就不能使用，卡后面不能使用了等？',
            '征信施压': '是否催收员提到了征信信用话术，强调继续不还款会导致征信受影响，征信恶化，会上报征信影响后续用卡等？',
            '法诉施压': '是否催收员提到法律法诉话术，强调法诉后果，如走法律途径，下发律师函传票，移交法务部门，不排除起诉，承担法律后果等？',
            '资产冻结': '是否催收员使用资产冻结话术，强调继续逾期，可能导致银行账户，支付宝，微信等被冻结等？',
            '降额': '是否催收员使用降额话术，强调继续逾期，导致信用卡额度，可用消费额度被降低，或者强制降额等？',
            '风险施压': '是否催收员使用风险升级话术，强调如果不还款，变为高风险客户，风险标红状态，进行风险核查和不排除终止合作等？'
        }
        self.questions = [q for l, q in self.PRESSURE_LABEL_2_QUESTION.items()]
        self.labels = [l for l, q in self.PRESSURE_LABEL_2_QUESTION.items()]

        self.max_question_len = max(len(s) for s in self.questions)
        self.question_num = len(self.questions)


    def proprocess(self, triton_output):
        has_logits, logits, has_logits_cls, has_logits_mean = triton_output
        labels = []
        for i, has_logit in enumerate(has_logits):
            if has_logit > 0.5:
                labels.append(self.labels[i])
        return labels



    def __call__(self, query):
        #change user rank input into our input pairs
        texts = self.question_num*[query]
        return self.predict(texts, self.questions)

#BertForQuestionAnswering
#BertForTokenClassification

if __name__ == "__main__":

    model = MRC(triton_host="30.171.160.35", model="agent_pressure_mrc", vocab="triton_bert/tests/vocab/bert_mrc")
    #context = "你再不还钱，你的征信就会被扣分了"

    #context = '你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了'
    #context = '你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了你再不还钱，你的征信就会被扣分了'[:450]
    context = "你每次都是这样说有什么意义呢？对不对？像女士，您不是说每一次都老是说感冒，就是说有些事情又有电话进来，那你是这样的，你如果说现在确实没有办法去处理的话，那您后续怎么样，做好应诉准备了你这边的话，你看嘛，三万块钱以上就是大额了。那您没有按照规定的时间还吗？八月二十六号，你还了一笔到现在十一月十十一月十九号你快将近三个月，你这边中间是没有一分钱的呀，我知道嘛。那男张先生想办法了，遇到问题在想办法在努力想办法嘛。"
    #context = "嗯。诶，您好，呃，请问是黄平谦先生吗？诶，您好，这边是平安清楚的来电是四零零，在平安银行信用卡卡片呢，出现这个严重逾期了违约材料就看了一下您的卡片，当前的是银行系统的一个高风险案件钱存在银行有多次通过电话，短信的方式提醒您去还款，您本人表示自己当前资金比较困难，暂时的话，没有能力偿还对吧，嗯，那先生您近期有困难，这个事情的话是短期的长期的呢，先生。啊，因为我看您这个卡片还用卡是呃，三年多四年的时间呢，前期还款记录一直都挺好，所以这次的话呢，逾期银行可能想到您应该是有遇到什么困难了，但是你也知道银行这个资金的话呢，是就相关的这个，呃，就监管了吗？我们监管，所以说没有办法，我给到您太久的时间，我们今天给你来电话呢，就是银行要求通知到您在今天上午十一点银行会批量上报高风险案件，一旦商贸过后卡片能百分百申请停卡降额可能会强制要求您在二十四小时以内全部结清这个三万多的一个全额，如果如果说是为零的话呢，后续可能会移交到这个案件调查科联系您家人朋友核实资金往来，这个情况，您是否是不具备这个偿还能力还是"[:450]
    ret = model(context)
    #print(f"context len: {len(context)}")
    #print(f"max question len: {model.max_question_len}")
    print(ret)
