"""
Command to retrieve all ORA2 data for a course in a .csv.


This command differs from upload_oa_data in that it places all the data into one file.

Generates the same format as the instructor dashboard downloads.
"""
import csv
from optparse import make_option
import os

from django.core.management.base import BaseCommand, CommandError

from openassessment.data import OraAggregateData


class Command(BaseCommand):
    """
    Query aggregated open assessment data, write to .csv
    """

    help = ("Usage: collect_ora2_data <course_id> --output-dir=<output_dir>")
    args = "<course_id>"

    option_list = BaseCommand.option_list + (
        make_option('-o', '--output-dir',
                    action='store', dest='output_dir', default=None,
                    help="Write output to a directory rather than stdout"),
        make_option('-n', '--file-name',
                    action='store', dest='file_name', default=None,
                    help="Write CSV file to the given name"),
    )

    def handle(self, *args, **options):
        """
        Run the command.
        """
        if not args:
            raise CommandError("Course ID must be specified to fetch data")

        course_id = args[0]

        if options['file_name']:
            file_name = options['file_name']
        else:
            file_name = ("%s-ora2.csv" % course_id).replace("/", "-")

        if options['output_dir']:
            csv_file = open(os.path.join(options['output_dir'], file_name), 'wb')
        else:
            csv_file = self.stdout

        writer = csv.writer(csv_file, dialect='excel', quotechar='"', quoting=csv.QUOTE_ALL)

        header, rows = OraAggregateData.collect_ora2_data(course_id)

        writer.writerow(header)
        for row in rows:
            writer.writerow(_encode_row(row))


def _encode_row(data_list):
    """
    Properly encode ora2 responses for transcription into a .csv
    """
    processed_row = []

    for item in data_list:
        new_item = unicode(item).encode('utf-8')
        processed_row.append(new_item)

    return processed_row
