# -*- coding: utf-8 -*-
"""
Python용 한글 맞춤법 검사 모듈
"""

__version__ = '1.1'

import requests
import json
import time
import sys
from collections import OrderedDict
import xml.etree.ElementTree as ET

from . import __version__
from .response import Checked
from .constants import base_url
from .constants import CheckResult

_agent = requests.Session()
PY3 = sys.version_info[0] == 3

def _remove_tags(text):

    text = u'<content>{}</content>'.format(text).replace('<br>','')
    if not PY3:
        text = text.encode('utf-8')


    result = ''.join(ET.fromstring(text).itertext())

    return result

def check(text):
    """
    매개변수로 입력받은 한글 문장의 맞춤법을 체크합니다.
    """
    if isinstance(text, list):
        result = []
        for item in text:
            checked = check(item)
            result.append(checked)
        return result

    # 최대 500자까지 가능.
    if len(text) > 500:
        return Checked(result=False)

    payload = {
        '_callback':'window.__jindo2_callback._spellingCheck_0',
        'q': text
    }

    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'
    }


    start_time = time.time()
    r = _agent.get(base_url, params=payload, headers = headers)
    passed_time = time.time() - start_time

    r = r.text[42:-2]

    data = json.loads(r)
    html = data['message']['result']['html']
    result = {
        'result': True,
        'original': text,
        'checked': _remove_tags(html),
        'errors': data['message']['result']['errata_count'],
        'time': passed_time,
        'words': OrderedDict(),
    }

    # 띄어쓰기로 구분하기 위해 태그는 일단 보기 쉽게 바꿔둠.
    # ElementTree의 iter()를 써서 더 좋게 할 수 있는 방법이 있지만
    # 이 짧은 코드에 굳이 그렇게 할 필요성이 없으므로 일단 문자열을 치환하는 방법으로 작성.
    #html = html.replace('<span class=\'re_green\'>', '<green>') \
               #.replace('<span class=\'re_red\'>', '<red>') \
               #.replace('<span class=\'re_purple\'>', '<purple>') \
               #.replace('</span>', '<end>')

    html = html.replace('<span', '') \
               .replace('</span>', '<end>')

    items = html.split(' ')
    words = []
    tmp = ''
    for word in items:
        
        if tmp == '' and word[:1] == '<':
            pos = word.find('>') + 1
            tmp = word[:pos]
        elif tmp != '':
            word = u'{}{}'.format(tmp, word)
        
        if word == '' :
            continue

        if word[-5:] == '<end>':
            word = word.replace('<end>', '')
            tmp = ''

        words.append(word)

    for word in words:
        check_result = CheckResult.PASSED
        if word[:17] == 'class=\'red_text\'>':
            check_result = CheckResult.WRONG_SPELLING
            word = word.replace('class=\'red_text\'>', '')
        elif word[:19] == 'class=\'green_text\'>':
            check_result = CheckResult.WRONG_SPACING
            word = word.replace('class=\'green_text\'>', '')
        elif word[:20] == 'class=\'purple_text\'>':
            check_result = CheckResult.AMBIGUOUS
            word = word.replace('class=\'purple_text\'>', '')

        result['words'][word] = check_result

    result = Checked(**result)

    return result

# -*- coding: utf-8 -*-
"""
Python용 한글 맞춤법 검사 모듈
"""

__version__ = '1.1'

import requests
import json
import time
import sys
from collections import OrderedDict
import xml.etree.ElementTree as ET

from . import __version__
from .response import Checked
from .constants import base_url
from .constants import CheckResult

_agent = requests.Session()
PY3 = sys.version_info[0] == 3

def _remove_tags(text):

    text = u'<content>{}</content>'.format(text).replace('<br>','')
    if not PY3:
        text = text.encode('utf-8')


    result = ''.join(ET.fromstring(text).itertext())

    return result

def check(text):
    """
    매개변수로 입력받은 한글 문장의 맞춤법을 체크합니다.
    """
    if isinstance(text, list):
        result = []
        for item in text:
            checked = check(item)
            result.append(checked)
        return result

    # 최대 500자까지 가능.
    if len(text) > 500:
        return Checked(result=False)

    payload = {
        '_callback':'window.__jindo2_callback._spellingCheck_0',
        'q': text
    }

    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'
    }


    start_time = time.time()
    r = _agent.get(base_url, params=payload, headers = headers)
    passed_time = time.time() - start_time

    r = r.text[42:-2]

    data = json.loads(r)
    html = data['message']['result']['html']
    result = {
        'result': True,
        'original': text,
        'checked': _remove_tags(html),
        'errors': data['message']['result']['errata_count'],
        'time': passed_time,
        'words': OrderedDict(),
    }

    # 띄어쓰기로 구분하기 위해 태그는 일단 보기 쉽게 바꿔둠.
    # ElementTree의 iter()를 써서 더 좋게 할 수 있는 방법이 있지만
    # 이 짧은 코드에 굳이 그렇게 할 필요성이 없으므로 일단 문자열을 치환하는 방법으로 작성.
    #html = html.replace('<span class=\'re_green\'>', '<green>') \
               #.replace('<span class=\'re_red\'>', '<red>') \
               #.replace('<span class=\'re_purple\'>', '<purple>') \
               #.replace('</span>', '<end>')

    html = html.replace('<span', '') \
               .replace('</span>', '<end>')

    items = html.split(' ')
    words = []
    tmp = ''
    for word in items:
        
        if tmp == '' and word[:1] == '<':
            pos = word.find('>') + 1
            tmp = word[:pos]
        elif tmp != '':
            word = u'{}{}'.format(tmp, word)
        
        if word == '' :
            continue

        if word[-5:] == '<end>':
            word = word.replace('<end>', '')
            tmp = ''

        words.append(word)

    for word in words:
        check_result = CheckResult.PASSED
        if word[:17] == 'class=\'red_text\'>':
            check_result = CheckResult.WRONG_SPELLING
            word = word.replace('class=\'red_text\'>', '')
        elif word[:19] == 'class=\'green_text\'>':
            check_result = CheckResult.WRONG_SPACING
            word = word.replace('class=\'green_text\'>', '')
        elif word[:20] == 'class=\'purple_text\'>':
            check_result = CheckResult.AMBIGUOUS
            word = word.replace('class=\'purple_text\'>', '')

        result['words'][word] = check_result

    result = Checked(**result)

    return result

# -*- coding: utf-8 -*- Python용 한글 맞춤법 검사 모듈 매개변수로 입력받은 한글 문장의 맞춤법을 체크합니다. # 최대 500자까지 가능. # 띄어쓰기로 구분하기 위해 태그는 일단 보기 쉽게 바꿔둠. # ElementTree의 iter()를 써서 더 좋게 할 수 있는 방법이 있지만 # 이 짧은 코드에 굳이 그렇게 할 필요성이 없으므로 일단 문자열을 치환하는 방법으로 작성. #html = html.replace('<span class=\'re_green\'>', '<green>') \ #.replace('<span class=\'re_red\'>', '<red>') \ #.replace('<span class=\'re_purple\'>', '<purple>') \ #.replace('</span>', '<end>')