import json
import logging
from tqdm import tqdm

from django.core.management.base import BaseCommand

from apps.subscriptions.models import Plan, Extention

logger = logging.getLogger(__name__)

class Command(BaseCommand):
    help = 'Upload plans from a JSON file to the database'

    def add_arguments(self, parser):
        parser.add_argument('filename', type=str, help='JSON file containing plans')

    def handle(self, *args, **options):
        filename = options['filename']
        with open(filename) as f:
            plans = json.load(f)

        with tqdm(total=len(plans), desc="Inserting plans", unit="plan") as pbar:
            for plan_data in plans:
                plan = self.create_plan(plan_data)
                if plan is not None:
                    pbar.update(1)
                    self.stdout.write(self.style.SUCCESS(f'Successfully added plan "{plan.plan_name} {plan.plan_duration}"'))

    def create_plan(self, plan_data):
        """Create a Plan object from the given data and add it to the database"""

        plan_data.pop('created', None) # exclude created field
        valid_extentions = plan_data.pop('valid_extentions', '')
        ext_ids = [int(ext_id) for ext_id in valid_extentions.split(',') if ext_id]
        valid_extentions = Extention.objects.filter(id__in=ext_ids)
        try:
            plan = Plan.objects.get(plan_name=plan_data['plan_name'], plan_duration=plan_data['plan_duration'])
            logger.warning(f"Plan {plan_data['plan_name']} {plan_data['plan_duration']} already exists.")
            self.stdout.write(self.style.WARNING(f'Plan "{plan.plan_name} {plan.plan_duration}" already exists.'))
            return None
        except Plan.DoesNotExist:
            plan = Plan(**plan_data)
            plan.save()
            plan.valid_extentions.set(valid_extentions)
            return plan
