#!/usr/bin/python3

import argparse
import os
import sys
import shutil
import shotiser

#from folder import Folder
# import sys
#
from erimp import Erimp
from ishus import Ishus
from otria import Otria
from mocla import Mocla
from riffer import Riffer
from rixer import Rixer
from notip import Notip
from report import Report


import shotiser
import dater
import filer
import rifop

desc = 'unleash as issue'
parser = argparse.ArgumentParser(description=desc)
parser.add_argument('-v', action='store_true', help='raise verbosity')
parser.add_argument('-n', action='store_true', help='no write')
parser.add_argument('-r', type=str, help='only repcode')
parser.add_argument('-i', type=str, help='only issudate')
parser.add_argument('-f', type=str, help='issue file')
parser.add_argument('bapis', metavar='bnp', type=str, nargs='*',
                    help='bits and pieces arguments')
args = parser.parse_args()

e = Erimp(args.bapis, do_verbose=args.v)

do_verbose = args.v
issues_fudi = e.dirs['issues']
notip = Notip(e, do_verbose=do_verbose)
otria = Otria(e)
ishus = Ishus(e)
rixer = Rixer(e)
riffer = Riffer(e, do_verbose=do_verbose)
mocla = Mocla(e)

## issues take place at night
tonight = dater.tonight()

only_repcode = None
if args.r is not None:
    only_repcode = args.r

fufi = args.f
if fufi is not None:
    if not os.path.isfile():
        print(f"I don't see {fufi}")
        sys.exit()
    issuedate = riffer.issuedate(fufi)
    if issuedate not in e.issuedates:
        msg = f"I don't have the issuedate {issuedate}"
        msg += " implicit in {fufi}"
        print(msg, file=sys.stderr)
        sys.exit()
elif args.i is not None:
    issuedate = args.i
    if issuedate not in e.issuedates:
        msg = f"I don't have the issuedate {issuedate}"
        print(msg, file=sys.stderr)
        sys.exit()
    fufi = ishus.fufi(issuedate)

if fufi is None and 'brown_dir' in e.conf and tonight not in e.issuedates:
    if do_verbose:
        print("I go brown.")
    brown_fudi = e.conf['brown_dir']
    amf_ext = e.abovo.constants['ext_amf']
    if not os.path.isdir(brown_fudi):
        print("I can't see {brown_fudi}", file=sys.stderr)
        sys.exit()
    tonight = dater.tonight()
    brown_fufi = brown_fudi + '/' + tonight + amf_ext + '.gz'
    if not os.path.isfile(brown_fufi):
        print(f"I can't see {brown_fufi}", file=sys.stderr)
        sys.exit()
    if tonight != dater.today():
        print("I can't do a brown release in the evening.")
        sys.exit()
    shoti = shotiser.now()
    target_fufi = e.dirs['issues'] + '/' + tonight + '_'
    target_fufi += shoti + amf_ext + '.gz'
    ## This needs a check whether the file is there
    if issuedate not in e.issuedates:
        if do_verbose:
            print(f"I install {brown_fufi} as {target_fufi}")
        shutil.copy(brown_fufi, target_fufi)
    else:
        if do_verbose:
            print(f"I already have an issue for {issuedate}")
    fufi = target_fufi

## check the date is tonight
if args.i is None and args.f is None:
    # # neither issudate nor fufi are given, look at last issuedate
    last_issuedate = ishus.last_issuedate()
    if ishus.last_issuedate() != tonight:
        print(f"last issudate {last_issuedate} is not tonight {tonight}.")
        sys.exit()
    ## set for last fufi
    last_fufi = ishus.last_fufi()
    if tonight in last_fufi:
        if do_verbose:
            print(f"I use tonight's {last_fufi}")
        fufi = last_fufi
    issuedate = last_issuedate


issue_doc = filer.parse_lax(fufi)
if issue_doc is None:
    print(f"I can't use {fufi}.")
    sys.exit()
docs = rixer.docs(issue_doc)
if len(docs) == 0:
    print(f"No papers in {fufi}.")
    sys.exit()

## no need to take account of holidays, yanabino does
## that for us

## no need to take account of bremse, not working in NEP
##


repcodes = otria.by_timely()

# # active reports
repcodes = otria.by_timely()
if only_repcode is not None and only_repcode not in repcodes:
    print(f"I don't see {only_repcode}")
    sys.exit()

for repcode in repcodes:
    if only_repcode is not None and repcode != only_repcode:
        continue
    report = Report(e, repcode)
    if not report.is_active():
        if do_verbose:
            print(f"{repcode} is bremsed")
        continue
    source_fudi = report.dirs['source']
    ## this is gziped
    if rifop.count_by_issuedate(source_fudi, issuedate) == 0:
        if do_verbose:
            print("I call mocla {repcode} {isseudate}")
        out_fufi = mocla.run(repcode, issuedate, do_verbose=True)
        if out_fufi is None:
            print(f"I can't mocla {repcode} for {issuedate}")
            continue
        txt = filer.sread(out_fufi)
        # # should use
        bana = riffer.bana(issuedate)
        # # but that yields
        # #Traceback (most recent call last):
        # #File "/home/ernad/ernad/bin/unleash", line 149, in <module>
        # #bana = riffer.bana(issuedate)
        # #       ^^^^^^^^^^^^^^^^^^^^^^
        # #TypeError: 'NoneType' object is not callable
        #shoti = shotiser.now()
        #bana = issuedate + '_' + shoti + e.const['amf_ext']
        source_fufi = report.dirs['source'] + '/' + bana
        filer.srite(source_fufi, txt, do_change_check=False)
    else:
        source_fufis = rifop.list_by_issuedate(source_fudi, issuedate)
        source_fufi = source_fufis[0]
    result = notip.new_issue(source_fufi, repcode, dont_send=args.n)
    if result is None:
        print(f"I can't notip {repcode} for {issuedate}")
        continue

# # inactive reports
for repcode in repcodes:
    if only_repcode is not None and repcode != only_repcode:
        continue
    report = Report(e, repcode)
    if report.is_active() and do_verbose:
        print(f"{repcode} is active")
        continue
    # report = Report(e, repcode)
    result = notip.bremsed(repcode, issuedate, dont_send=args.n)
    if result is None:
        print("I can't notip {repcode} for {issuedate}")
        continue
