import re

from django.db.models import Q

from BookDatabase.models import *

alpha = re.compile("[^a-zA-Z0-9 ]+")
quotes = re.compile("""["“”]""")
squotes = re.compile("""['‘’]""")

def bookSearchQ(term):
    return quoteSplit(term)


def strictSearchQ(term):
    q = (Q(Name__icontains=term) | Q(Author__icontains=term) | Q(ISBN__icontains=term) | Q(Notes__icontains=term))
    return q


def simpleSplit(term):
    term = alpha.sub('', term)
    terms = term.split()
    q = Q()
    for i in terms:
        q = q | (Q(Name__icontains=i) | Q(Author__icontains=i) | Q(ISBN__icontains=i) | Q(Notes__icontains=i))
    return q


def quoteSplit(term):
    terms1=quotes.split(term)
    ands=[]
    ors=[]
    for j in range(len(terms1)):
        terms2=squotes.split(terms1[j])
        # set whether to add to required or optional
        if (j%2)==1 and (j!=len(terms1)-1):
            terms=ands
        else:
            terms=ors
        for i in range(len(terms2)):
            if (i%2)==0 or (i==len(terms2)-1):
                # stuff not single quoted
                terms3=terms2[i].split()
                for t in terms3:
                    terms.append(alpha.sub('', t))
            else:
                # stuff single quoted
                terms.append(alpha.sub('',terms2[i]))

    print(ands)
    print(ors)

    q = Q()
    for i in ands:
        i = alpha.sub('', i)
        q = q & Q(Q(Name__icontains=i) | Q(Author__icontains=i) | Q(ISBN__icontains=i) | Q(Notes__icontains=i))

    p = Q()
    for i in ors:
        p = p | (Q(Name__icontains=i) | Q(Author__icontains=i) | Q(ISBN__icontains=i) | Q(Notes__icontains=i))

    return q & p
