"""
Django management command to migrate a course from the old Mongo modulestore
to the new split-Mongo modulestore.
"""
from django.contrib.auth.models import User
from django.core.management.base import BaseCommand, CommandError
from opaque_keys import InvalidKeyError
from opaque_keys.edx.keys import CourseKey

from contentstore.management.commands.utils import user_from_str
from xmodule.modulestore import ModuleStoreEnum
from xmodule.modulestore.django import modulestore
from xmodule.modulestore.split_migrator import SplitMigrator


class Command(BaseCommand):
    """
    Migrate a course from old-Mongo to split-Mongo. It reuses the old course id except where overridden.
    """

    help = "Migrate a course from old-Mongo to split-Mongo. The new org, course, and run will " \
           "default to the old one unless overridden."

    def add_arguments(self, parser):
        parser.add_argument('course_key')
        parser.add_argument('email')
        parser.add_argument('--org', help='New org to migrate to.')
        parser.add_argument('--course', help='New course key to migrate to.')
        parser.add_argument('--run', help='New run to migrate to.')

    def parse_args(self, **options):
        """
        Return a 5-tuple of passed in values for (course_key, user, org, course, run).
        """
        try:
            course_key = CourseKey.from_string(options['course_key'])
        except InvalidKeyError:
            raise CommandError("Invalid location string")

        try:
            user = user_from_str(options['email'])
        except User.DoesNotExist:
            raise CommandError("No user found identified by {}".format(options['email']))

        return course_key, user.id, options['org'], options['course'], options['run']

    def handle(self, *args, **options):
        course_key, user, org, course, run = self.parse_args(**options)

        migrator = SplitMigrator(
            source_modulestore=modulestore(),
            split_modulestore=modulestore()._get_modulestore_by_type(ModuleStoreEnum.Type.split),
        )

        migrator.migrate_mongo_course(course_key, user, org, course, run)