import xapian

# database = xapian.WritableDatabase("db", xapian.DB_CREATE_OR_OPEN)

# Read Only
# database = xapian.Database("db")

# indexer = xapian.TermGenerator()
# stemmer = xapian.Stem("english")
# indexer.set_stemmer(stemmer)


def search(institution, qs, offset=0, limit=10):
    try:
        database = xapian.Database("db")
    except (xapian.DatabaseNotFoundError, xapian.DatabaseOpeningError):
        return

    qp = xapian.QueryParser()
    qp.set_database(database)
    qp.set_stemmer(xapian.Stem("english"))
    qp.set_stemming_strategy(xapian.QueryParser.STEM_SOME)
    qp.add_prefix("uuid", "uuid")
    query = qp.parse_query(qs)
    if institution:
        institution_term = "U{}".format(institution.id)
        final_query = xapian.Query(
            xapian.Query.OP_AND, query, xapian.Query(institution_term)
        )
    else:
        final_query = xapian.Query(query)
        
    enquire = xapian.Enquire(database)
    enquire.set_query(final_query)
    matches = enquire.get_mset(offset, limit)
    return matches


def index(institution, uuid, snap):
    uuid = 'uuid:"{}"'.format(uuid)
    matches = search(institution, uuid, limit=1)
    if matches and matches.size() > 0:
        return

    database = xapian.WritableDatabase("db", xapian.DB_CREATE_OR_OPEN)
    indexer = xapian.TermGenerator()
    stemmer = xapian.Stem("english")
    indexer.set_stemmer(stemmer)

    doc = xapian.Document()
    doc.set_data(snap)

    indexer.set_document(doc)
    indexer.index_text(snap)
    indexer.index_text(uuid, 10, "uuid")
    # indexer.index_text(snap, 1, "snapshot")
    institution_term = "U{}".format(institution.id)
    doc.add_term(institution_term)

    database.add_document(doc)