from django.core.management import BaseCommand
from hookmigration.peewee_models import CustomersCoffeereview, CustomersOrder, CoffeesBrewmethod, CoffeesCoffeetype
from hookmigration.peewee_models import CustomersCustomer
from oscar.core.loading import get_model
from django.contrib.auth.models import User
from peewee import JOIN
from hookmigration.models import Transient
from django.contrib.contenttypes.models import ContentType
from django.db import transaction
import crayons
import progressbar
from review.models import Review

Product = get_model('catalogue', 'Product')

"""
1. Find the user.
2. Find the coffee

brew = ForeignKeyField(column_name='brew_id', field='id', model=CoffeesBrewmethod, null=True)
coffee = ForeignKeyField(column_name='coffee_id', field='id', model=CoffeesCoffeetype)
comment = TextField()
created_at = DateTimeField()
hidden = BooleanField()
order = ForeignKeyField(column_name='order_id', field='id', model=CustomersOrder)
rating = IntegerField(null=True)
"""

product_ct = ContentType.objects.get_for_model(Product)
user_ct = ContentType.objects.get_for_model(User)
review_ct = ContentType.objects.get_for_model(Review)


class Command(BaseCommand):

    def handle(self, *args, **options):
        reviews = CustomersCoffeereview.select().join(CustomersOrder).join(CustomersCustomer,
                                                                           JOIN.LEFT_OUTER).join_from(
            CustomersCoffeereview, CoffeesBrewmethod, JOIN.LEFT_OUTER
        ).join_from(
            CustomersCoffeereview, CoffeesCoffeetype, JOIN.LEFT_OUTER
        )
        total = reviews.count()
        finished = 0

        bar = progressbar.ProgressBar(max_value=total)

        delete_bar = progressbar.ProgressBar(max_value=Review.objects.count())
        total_deleted = 0
        print(crayons.red('Going to delete all the reviews'))
        for item in Review.objects.all():
            item.delete()
            total_deleted += 1
            delete_bar.update(total_deleted)
        print(crayons.red('Deleted all existing reviews'))

        with transaction.atomic():
            print(crayons.red('Starting migration'))
            for review in reviews:
                # ------------------Find the user--------------------------------#
                new_user_id = Transient.objects.filter(
                    old_pk=review.order.customer.user_id
                ).filter(content_type=user_ct).first()

                if not new_user_id:
                    print('Missing ', review.order.customer.user)
                    new_user = User.objects.filter(username='admin').first()
                else:
                    try:
                        new_user = User.objects.filter(pk=new_user_id.new_pk).first()
                    except Exception as e:
                        print(e)

                # ----------------Find the coffee--------------------------------------------#
                new_coffee_id = Transient.objects.filter(old_pk=review.coffee_id, content_type=product_ct)

                if not new_coffee_id.exists():
                    print('There is no ', review.coffee.name)

                coffee = Product.objects.filter(pk=new_coffee_id.first().new_pk).first()

                product_review = Review(
                    product=coffee,
                    score=review.rating,
                    body=review.comment.encode('unicode_escape'),
                    user=new_user,
                    status=Review.FOR_MODERATION if review.hidden else Review.APPROVED,
                    created=review.created_at.date()
                )

                product_review.save()

                Transient.objects.create(
                    old_pk=review.id,
                    new_pk=product_review.pk,
                    content_type=review_ct
                )
                finished += 1
                bar.update(finished)
            print(crayons.red('Now removing the b from all the reviews'))
            update_bar = progressbar.ProgressBar(max_value=Review.objects.count())
            finished_updates = 0
            for review in Review.objects.all():
                body = review.body.replace("b'", "")
                body = body[0:-1]
                review.body = body
                finished_updates += 1
                update_bar.update(finished_updates)
                review.save()
            print(crayons.red('Removed all the bs'))

        print(crayons.red('Updating the product averages'))

        product_update = progressbar.ProgressBar(max_value=Product.objects.count())
        finished = 0
        for product in Product.objects.all():
            product.update_rating()
            finished += 1
            product_update.update(finished)
