#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import division
import time,re,sys,os,csv
import pandas as pd
import pymongo
from pymongo import MongoClient
import random,operator
from collections import OrderedDict
from bson.son import SON
from bson.codec_options import CodecOptions
import string
from nltk.tokenize import word_tokenize
import json
from detect_polysachharide import detect_polysachharide

#--- create MongoDB client---
client = MongoClient()
opts = CodecOptions(document_class=SON)
pubtator2018DB = client.pubtator2018.medline.aligned.with_options(codec_options=opts)


def findMPSIn_abstract(pmid,fromDBCollection,toDBCollection):
    
    monosaccharide_name_tsv='dictionaries - sugars.tsv'
    raw_doc = fromDBCollection.find_one({"docId":pmid})
    entityList=[]
    if raw_doc and "text" in raw_doc and "sentence" in raw_doc:
        singleLetter_type3 = {"type3_1":[]}
        title_abstract = raw_doc["text"]
	#print(title_abstract)
	found_poly_l,span_list=detect_polysachharide(monosaccharide_name_tsv,title_abstract)

	
	for mpsi in range(len(found_poly_l)):
	    oneEntity={}
	    sentence = raw_doc["sentence"]
	    for senInfo in sentence:
		#senText_original = title_abstract[senInfo["charStart"]:senInfo["charEnd"]]
		senIndex = senInfo["index"]
		if span_list[mpsi][0]>=int(senInfo["charStart"]) and span_list[mpsi][1]<=int(senInfo["charEnd"]):
		    oneEntity["charEnd"]=span_list[mpsi][1]
		    oneEntity["charStart"]=span_list[mpsi][0]
		    oneEntity["sentenceIndex"]=senIndex
		    break
	    if "charEnd" not in oneEntity:
		oneEntity["charEnd"]=0
		oneEntity["charStart"]=0
		oneEntity["sentenceIndex"]=0
	    oneEntity["entityType"]="MPS"
	    oneEntity["source"]="MPSDetector"
	    oneEntity["entityText"]=found_poly_l[mpsi]
	    entityList.append(oneEntity)

		

            

    return entityList



def run_forEachPmid(pmid,fromDBCollection,toDBCollection):
    #pmid = 23534959
    pmidDic = findMPSIn_abstract(str(pmid),fromDBCollection,toDBCollection)
    return pmidDic

def run_forPmidFile(pmidFile,fromDBCollection,toDBCollection):
    pmidList = pd.read_csv(pmidFile).iloc[:,0].tolist() # : for all rows, 0 for col1
    # print(pmidList)
    for index,pmid in enumerate(pmidList):
        print(index,":",pmid)
        pmidDic = findMPSIn_abstract(str(pmid),fromDBCollection,toDBCollection)
    	print(pmidDic)
        
if __name__ == "__main__":
    pmidFile = 'combine.txt'
    dbF = 'pubtator'
    dbT = 'glyco'
    colF = 'medline.aligned'
    colT = 'EntityTest'

	   

    #--- create database instances---
    # Environment variables
    mongodb_host = os.environ.get("MONGODB_HOST","0.0.0.0") # change to biotm2.cis.udel.edu before dockerizing
    mongodb_port = os.environ.get("MONGODB_PORT","27017")
    db_name_from = os.environ.get("DBNAME_FROM",dbF) # change database name for your own dbName
    db_name_to = os.environ.get("DBNAME_TO",dbT) # change database name for your own dbName

    fromCollectionName = os.environ.get("COLLECTION_FROM",colF)
    toCollectionName = os.environ.get("COLLECTION_TO",colT)
    # Database URI
    MONGODB_URI = 'mongodb://'+mongodb_host+':'+mongodb_port+'/'

    # Database object
    client = MongoClient(MONGODB_URI)
    opts = CodecOptions(document_class=SON)

    # Database
    dbNameFrom = client[db_name_from] # medline
    dbNameTo = client[db_name_to] # New DB: glygen

    # Collection
    fromDBCollection = dbNameFrom[fromCollectionName].with_options(codec_options=opts)
    toDBCollection = dbNameTo[toCollectionName].with_options(codec_options=opts)

    pmidJSON = run_forPmidFile(pmidFile,fromDBCollection,toDBCollection)
    # pmidJSON = run_forEachPmid(pmid,fromDBCollection,toDBCollection)
