''' handle reading a csv from goodreads '''
import csv
from requests import HTTPError

from bookwyrm import outgoing
from bookwyrm.tasks import app
from bookwyrm.models import ImportJob, ImportItem
from bookwyrm.status import create_notification

# TODO: remove or increase once we're confident it's not causing problems.
MAX_ENTRIES = 500


def create_job(user, csv_file, include_reviews, privacy):
    ''' check over a csv and creates a database entry for the job'''
    job = ImportJob.objects.create(
        user=user,
        include_reviews=include_reviews,
        privacy=privacy
    )
    for index, entry in enumerate(list(csv.DictReader(csv_file))[:MAX_ENTRIES]):
        if not all(x in entry for x in ('ISBN13', 'Title', 'Author')):
            raise ValueError("Author, title, and isbn must be in data.")
        ImportItem(job=job, index=index, data=entry).save()
    return job


def start_import(job):
    ''' initalizes a csv import job '''
    result = import_data.delay(job.id)
    job.task_id = result.id
    job.save()


@app.task
def import_data(job_id):
    ''' does the actual lookup work in a celery task '''
    job = ImportJob.objects.get(id=job_id)
    try:
        results = []
        for item in job.items.all():
            try:
                item.resolve()
            except HTTPError:
                pass
            if item.book:
                item.save()
                results.append(item)

                # shelves book and handles reviews
                outgoing.handle_imported_book(
                    job.user, item, job.include_reviews, job.privacy)
            else:
                item.fail_reason = "Could not find a match for book"
                item.save()
    finally:
        create_notification(job.user, 'IMPORT', related_import=job)