#!/usr/bin/env python3

import argparse
import datetime
import os
from sqlalchemy.orm import joinedload
import subprocess
import tempfile

import mo.db as db
import mo.submit
import mo.util

parser = argparse.ArgumentParser(description='Pokusí se opravit rozbitá PDF')
parser.add_argument(dest='id', type=int, nargs='?', help='ID papíru k opravení')
args = parser.parse_args()

mo.util.init_standalone()
sess = db.get_session()

fixed = 0
errors = 0


def fix_paper(id: int):
    global fixed, errors

    paper = (sess.query(db.Paper)
             .options(joinedload(db.Paper.for_user_obj))
             .get(id))
    assert paper is not None
    assert paper.orig_file_name is not None
    print(f"=== Paper #{id} ({paper.orig_file_name}){' [RETRY]' if paper.fixed_at else ''}")

    tmp_file = tempfile.NamedTemporaryFile(dir=mo.util.data_dir('tmp'), prefix='fix-')
    res = subprocess.run(['qpdf', os.path.join(mo.util.data_dir('submits'), paper.orig_file_name), tmp_file.name])
    if res.returncode in [0, 3]:
        sub = mo.submit.Submitter()
        try:
            sub.submit_fix(paper, tmp_file.name)
            fixed += 1
        except mo.submit.SubmitException:
            errors += 1
    else:
        print(f'--> ERROR: qpdf failed with exit code {res.returncode}')
        errors += 1

    paper.fixed_at = datetime.datetime.now()
    sess.commit()


if args.id is not None:
    fix_paper(args.id)
else:
    papers = sess.query(db.Paper).filter_by(file_name=None).all()
    sess.rollback()
    for p in papers:
        fix_paper(p.paper_id)

print(f'Opraveno {fixed} PDF, stále rozbito {errors}')