import sys
import dater
from xpafs import Xpafs

class Spana():
    """deal with spans of issuedates"""

    def __init__(self, erimp, do_verbose=False):
        self.e = erimp
        self.xpafs = Xpafs(erimp)
        # # keeps the dates cashed here
        self.dates = {}

    def is_it_in(self, issuedate, kind, repcode=None,
                 do_report_missing=True):
        e = self.e
        if not e.conf[kind]:
            if do_report_missing:
                print("spana has no kind {kind} to check for",
                      file=sys.stderr)
            # # we return False as the default choice
            return None
        dates = self.build(kind)
        if issuedate in dates:
            return True
        return False

    def build(self, kind):
        if kind in self.dates:
            return self.dates[kind]
        issuedates = self.e.issuedates
        kind_total = int(self.e.conf[kind])
        count = 0
        self.dates[kind] = {}
        while count < kind_total:
            issuedate = issuedates[count]
            self.dates[kind][issuedate] = 1
            count += 1
        # # bug of 2024-09-08, add future issuedate
        # # to allow for brown period work
        future_issuedate = dater.ahead(issuedates[0], 7)
        self.dates[kind][future_issuedate] = 1
        return self.dates[kind]

    def has_it_same(self, verb_1, verb_2):
        for attrib in ('from', 'until'):
            if attrib in verb_1.attrib:
                if attrib not in verb_2.attrib:
                    return False
                if verb_2.attrib[attrib] != verb_1.attrib[attrib]:
                    return False
            if attrib in verb_2.attrib:
                if attrib not in verb_1.attrib:
                    return False
                if verb_1.attrib[attrib] != verb_2.attrib[attrib]:
                    return False
        return True

    def has_it_rel(self, doc, verb, issuedate):
        xp = '/a:collection/a:' + verb
        rels = self.xpafs.all(doc, xp)
        if len(rels) == 0:
            return False
        for rel in rels:
            if self.is_it_current(rel, issuedate):
                return True
        return False

    def is_it_current(self, verb, issuedate):
        if 'from' in verb.attrib:
            if issuedate < verb.attrib['from']:
                return False
        if 'until' in verb.attrib:
            if issuedate > verb.attrib['until']:
                return False
        return True
