# -*- coding:utf-8 -*-
import os
import sys
import time
import numpy as np
import cv2 as cv
import json
from BaseLog import CBaseLog
from OptionConfig import COptionConfig
from ssat_sdk import OCRConvert, ImageCMP, getSATTmpDIR


class COptionOCR(CBaseLog):
    # 创建OCR对象
    __ocr = OCRConvert()
    # 图片切割对象
    __imgCMP = ImageCMP()

    def __init__(self, optionConfig, optionExcel):
        CBaseLog.__init__(self)
        # COptionConfig对象;
        self.__optionConfig = optionConfig
        if self.__optionConfig is None:
            self.error("configManger对象空")
        # 路径对象;
        self.__optionExcel = optionExcel

    '''
    函数:获取指定原图中指定的文本区域内的文本内容;
    参数:
        optionName: Option名称;
        src_pid:    原图文件路径;
        texb_box:   原图中要获取文本内容的区域坐标;
        ocr_config: 使用何种方式识别文本;   示例:{"lan": "ChinesePRC+English", "type": 4}
    返回:
        返回文本内容;
    '''

    def getOptionText(self, optionName, src_pic, text_box, ocr_config):
        src_img = src_pic
        # 如果是字符串,认为是路径;
        if type(src_pic) == str:
            src_img = cv.imread(src_pic)

        # 判断图片对象是否空;
        if src_img is None:
            self.error(u"读取图片失败:%s" % src_pic)
            return None

        return self.__getOptionText(optionName, src_img, text_box, ocr_config)

    '''
    函数:获取指定原图中指定的文本区域内的文本内容;
    参数:
        optionName: Option名称;
        src_img:    原图图片对象(cv2.imread的结果值);
        texb_box:   原图中要获取文本内容的区域坐标;
        ocr_config: 使用何种方式识别文本;   示例:{"lan": "ChinesePRC+English", "type": 4}
    返回:
        返回文本内容;
    '''

    def __getOptionText(self, optionName, src_img, text_box, ocr_config):
        if text_box.__len__() == 0:
            self.error(u"【%s】文本区域空" % optionName)
            return None

        # 配置文本图片路径,保存文本区域截图;
        text_pic = os.path.join(getSATTmpDIR(), "meuttree_area_text.png")
        COptionOCR.__imgCMP.saveCropImage(src_img, text_pic, text_box)
        # 判断文本图片是否存在;
        if not os.path.exists(text_pic):
            self.error(u"【%s】保存文本区域截图失败" % optionName)
            return None

        # 获取ocr识别时阈值(疑似问题:不是使用optionName,而是对应的first_parent)
        # 示例:threshold = {"Threshold":[25,255,0]}
        threshold = self.__optionConfig.getThresholdDict(optionName)

        # 识别文本图片内容;
        optionText = COptionOCR.__ocr.getStrWithImgProcess(text_pic, threshold, ocr_config['lan'], ocr_config['type'],
                                                           reconTimes=1)

        self.info(u"【%s】识别结果=%s" % (optionName, optionText))
        # 返回结果;
        return optionText

    '''
    函数:识别指定图片文件的文本内容;
    参数:
        text_pic:      要识别文本的图片路径;
        ocr_config:     使用何种方式识别文本;   示例:{"lan": "ChinesePRC+English", "type": 4}
        threshold:      orc识别时的阈值,示例:{"Threshold":[25,255,0]}
    返回:
    '''

    def getImageText(self, text_pic, ocr_config, threshold):
        # 判断文本图片是否存在;
        if not os.path.exists(text_pic):
            self.error(u"【%s】文本图片不存在" % text_pic)
            return None

        # 识别文本图片内容;
        imgText = COptionOCR.__ocr.getStrWithImgProcess(text_pic, threshold, ocr_config['lan'], ocr_config['type'],
                                                        reconTimes=1)

        self.info(u"【%s】识别结果=%s" % (text_pic, imgText))
        # 返回结果;
        return imgText


# end-class


if __name__ == "__main__":
    pass