import sys
from datetime import datetime

import swapper
from django.core.exceptions import ValidationError
from django.core.files import File
from django.core.management import BaseCommand, CommandError

from django_freeradius.settings import BATCH_DEFAULT_PASSWORD_LENGTH

RadiusBatch = swapper.load_model("django_freeradius", "RadiusBatch")


class BaseBatchAddUsersCommand(BaseCommand):
    help = "Add a batch of users from a file"

    def add_arguments(self, parser):
        parser.add_argument('--name',
                            action='store',
                            help='Name of the event of batch addition')
        parser.add_argument('--file',
                            action='store',
                            help='Will import users from the file')
        parser.add_argument('--expiration',
                            action='store',
                            default=None,
                            help='Will deactivate users after this date')
        parser.add_argument('--password-length',
                            action='store',
                            default=BATCH_DEFAULT_PASSWORD_LENGTH,
                            type=int)

    def handle(self, *args, **options):
        try:
            csvfile = open(options['file'], 'rt')
        except IOError:
            raise CommandError('File does not exist')
        expiration_date = options['expiration']
        if expiration_date:
            expiration_date = datetime.strptime(expiration_date, '%d-%m-%Y')
        batch = self._create_batch(**options)
        batch.expiration_date = expiration_date
        batch.save()
        batch.csvfile.save(csvfile.name.split('/')[-1], File(csvfile))
        csvfile.seek(0)
        try:
            batch.csvfile_upload(csvfile, options['password_length'])
        except ValidationError:
            batch.delete()
            self.stdout.write('Error in uploading users from the file')
            sys.exit(1)
        self.stdout.write('Added a batch of users from a csv file')
        csvfile.close()

    def _create_batch(self, **options):
        batch = RadiusBatch(name=options['name'], strategy='csv')
        return batch
