# encoding: utf-8

import csv
import corpus2

"""
Filtruje wejsciowa relccl'le wykorzystujac jako filtr zestaw
relacji z plikow 1s, 2s, 3s (przefiltrowane, pozytywne decyzje lingwistow,
podzielone na pojedyncze odpowiedzi).

Wejsciem jest:
 * plik relccl
 * 4os+m-positive
 * 4os-m-positive
 * 3os-m-positive

Wyjsciem:
 * nowy plik relccl
"""

ACCEPT_RELS = [
  '3args_rel_1st_part',
  '3args_rel_2nd_part',
  'SUBIEKT-PPAS-przez-acc-testowy-0',
  'SUBIEKT-PACT-0',
  'SUBIEKT-nacc-0',
  'OBIEKT-PACT-acc-0',
  'OBIEKT-PPAS-0',
  'MIEJSCE-cos-PP-0',
  'KWANTYFIKATOR-A-0',
  'KWANTYFIKATOR-E-0',
  'KWANTYFIKATOR-neg-A-0',
  'KWANTYFIKATOR-E-jeden-z-0',
  'SUBIEKT-N-przez-acc-0',
  'CZAS-PP-0',
  'PRED-MIEJSCE-PP-0',
  'SUBIEKT-N-przez-acc-0',
  'CZAS-MERONIMIA-gen-grot-wskazuje-calosc-0',
  'MERONIMIA-MIEJSCA-gen-grot-wskazuje-calosc-0',
  'ILOSC-gen-grot-wskazuje-ilosc-0',
  'PRZEZNACZENIE-PP-dla-0',
  '2args_rel',
  'OBIEKT-acc-0',
  'OBIEKT-ZDARZ-0',
  'WLASCIWOSC-0',
  'KOLEJNOSC-0', 'RODZINA-gen-0', 'RODZINA-agpp-0', 
  'MIEJSCE-PP-0', 'MATERIAL-PP-0', 'CZAS-gen-0', 'INSTRUMENT-0',
  'DETERMINATOR-0', 'CZAS-inst-0', 'KWANTYFIKATOR-A-neg-0',
  'CZAS-PP-pred-0',
  'subj',
  'conjunct',
  'punct',
  'complm',
  'adjunct',
  'comp',
  'comp_fin',
  'comp_inf',
  'refl',
  'obj',
  'app', 'aglt', 'pre_coord',
  'abbrev_punct', 'obj_th', 'coord',
  'pred', 'coord_punct', 'cond',
  'ne', 'pd', 'neg', 'mwe', 'aux']

def read_ccl(cclpath, relcclpath, tagset='nkjp'):
  tagset=corpus2.get_named_tagset('nkjp')
  cclreader = corpus2.CclRelReader(tagset, cclpath, relcclpath)
  return cclreader.read()

def read_positive_decisions(decfiles):
  rels = {}
  for dec in decfiles:
    with open(dec, 'rt') as csvfile:
      spamreader = csv.reader(csvfile, delimiter='\t', quotechar='"')

      for line in spamreader:
        sfrom, sto, relname, dec = line[0], line[1], line[4], line[5].lower()
        if dec != 't':
          continue
        else:
          k = (sfrom, sto)
          if not rels.has_key(k):
            rels[k] = set()
          rels[k].add(relname)
  return rels

def main():
  os4m = "/home/pkedzia/dokumenty/Projekty/CLARIN/Entailment/s1-4o+m-positive.csv"
  os4 = "/home/pkedzia/dokumenty/Projekty/CLARIN/Entailment/s2-4o-m-positive.csv"
  os3 = "/home/pkedzia/dokumenty/Projekty/CLARIN/Entailment/s3-3o-m-positive.csv"

  inccl = "/mnt/dane_eksperymenty/entailment/new-2015-09/not-sampled-separated/output.xml"
  inrelccl= "/mnt/dane_eksperymenty/entailment/new-2015-09/not-sampled-separated/with-other-rels/ALL/Źródło.rel.xml"

  outrelccl = '{}-fixed.rel.xml'.format(inrelccl[:-8])

  rels = read_positive_decisions([os4m, os4, os3])
  doc = read_ccl(inccl, inrelccl)
  
  # Lista instancji relacji do usuniecia
  rcopy = []

  for r in doc.relations():
    fid = r.rel_from().sentence_id().strip()
    tid = r.rel_to().sentence_id().strip()
    fnm = r.rel_name().strip()
    if not fnm in ACCEPT_RELS and not rels.has_key((fid, tid)):
      print "Nie mam pary '{} {}' w ocenie ({})!".format(fid, tid, fnm)
    else:
      rcopy.append(r)

  rel_ccl_writer = corpus2.RelationWriter(outrelccl)
  rel_ccl_writer.write(rcopy)
  del rel_ccl_writer
  print outrelccl

if __name__ == '__main__':
  main()