"""

Functions:
find    Find the occurrences of words that should not be genes.

"""
from Extracto import memoize

NONGENES = [
    # Types of proteins (7).
    r'(?:[Hh]olo|[Aa]po)?[Pp]roteins?',
    r'c?[Dd][Nn][Aa]s?',
    r'(?:m|r|sno)?[Rr][Nn][Aa]s?',
    r'[Gg]enes?',
    r'[Cc](hemo|yto)-?kines?',   # cytokine, chemokine
    r'(?:[Tt]wo-)?[Hh]ybrids?',
    r'[Ff]ilaments?',

    # Subunits or parts of genes/proteins (12).
    r'[Pp]eptides?',
    r'[Cc]hains?',
    r'[Dd]omains?',
    r'[Ss]ubunits?',
    r'[Ff]ragment(?:s|ation)?',
    r'[Bb]ox(:?es)?',
    r'[Oo]rigins?',
    r'[Mm]otifs?',
    r'[Bb]ases?',
    r'[Ss][Hh][23]s?',   # protein binding domain, 14-3-3 included
    r'UTRs?',
    r'LTRs?',
    r'[Pp]romoters?',

    # Complexes of genes/proteins (5)
    r'[Cc]omplex(?:es)?',
    r'[Cc]hromatin',
    r'MHCs?',
    r'[Aa]ntibod(?:y|ies)',
    r'm?Abs?',

    # Related molecules (5)
    r'[AaGg][TtDD][Pp]s?',   # ATP, GTP, ADP, GDP
    r'c?AMPs?',
    r'[Cc]ores?',
    r'[Ee]nvelopes?',
    r'[Ss]tructural',

    # Types of genes/proteins (12)
    r'[Aa]ctivated',
    r'[Aa]daptors?',
    r'[Cc]andidates?',
    r'[Cc]loned',
    r'[Ff]usion',
    r'[Ll]igands?',
    r'[Mm]olecules?',
    r'[Nn]ovel',
    r'[Rr]eceptors?',
    r'[Rr]egulators?',
    r'[Rr]eporters?',
    r'[Rr]epressors?',

    # Describes behavior of protein. (8)
    r'[Bb]inding',
    r'[Cc]onstitutive',
    r'[Dd]ependent',
    r'[Ee]xpress(?:ed|ion)',
    r'[Hh]omeodomains?',
    r'[Ii]nteracting',
    r'[Mm]ediated',
    r'[Rr]egulat(?:ed|ory)',

    # Viruses
    r'[a-z]?HIVs?-?\d*',
    r'[a-z]?HPVs?-?\d*',
    r'[a-z]?HSVs?-?\d*',
    r'[a-z]?PIVs?-?\d*',
    r'[Vv]irus',
    r'[Vv]iral',
    r'SV5',

    # Chemical
    r'CaCl2',
    r'Ca2',
    r'Mg2',
    r'NH2',
    r'NO2',
    r'NaHCO3',
    r'NaCl',
    r'ClO4',
    r'CH2',
    r'CO2?',
    r'CaCO3',
    r'(?:Mg|Fe)?SO4',
    r'COOH',

##    # Other scientific things
##    r'[Bb]rains?',
##    r'[Nn]eurons?',

##    # Other
##    r'[Ss]ame',
##    r'[Cc]ontaining',
##    r'[Rr]ich',
##    r'[Bb]asic',
##    r'[Rr]esponsible',
##    r'[Ii]ncluding',
##    r'[Uu]sing',
    ]

def _make_nongene_reobjs():
    import re
    return [re.compile(r"\b%s\b" % x) for x in NONGENES]
_make_nongene_reobjs = memoize.memoize(_make_nongene_reobjs)

def find(document):
    """Return list of (start, end)."""
    from Extracto import refns
    from Extracto import rangefns
    str_document = str(document)

    ranges = []
    reobjs = _make_nongene_reobjs()
    for obj in reobjs:
        matches = refns.re_findall(obj, str_document)
        ranges += [x.span() for x in matches]
    return rangefns.munge(ranges)
