from distutils.command.upload import upload
from django.db import models
from colorfield.fields import ColorField
from django.utils.html import mark_safe
import datetime 
from base.models import*
from io import BytesIO
from PIL import Image
from django.core.files import File
# Create your models here.


#magazine category model
class MagazineCategory(models.Model):
    category_name = models.CharField(max_length=50,null=True,blank=True)
    magazine_category_color = ColorField(default='#ffffff')
    magazine_category_icon = models.ImageField(upload_to='Images/CategoryIcons/')
    create_on = models.DateTimeField(auto_now=True)
    updated_on = models.DateTimeField(auto_now=True)

    def image_tag(self):
        return mark_safe('<img src="/media/%s" style="text-align:center; width:50px; height:50px; border-radius:30px;"/>' % (self.magazine_category_icon))

    image_tag.short_description = 'Category Icon'

    def color_tag(self):
        return mark_safe(f'<span style="background-color:%s; border-radius:30px; padding:8px;">{self.magazine_category_color}</span>' % (self.magazine_category_color))

    color_tag.short_description = 'Color'
    class Meta:
        db_table = "Magazine_Category"

    def __str__(self):
        return self.category_name

# system category model
class SystemCategory(models.Model):
    category_name = models.CharField(max_length=255)
    create_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "System_Category"

    def __str__(self):
        return self.category_name

# def compress(author_image):
#     im = Image.open(author_image)
#     im_io = BytesIO() 
#     im.save(im_io, 'JPEG', quality=10) 
#     new_image = File(im_io, name=author_image.name)
#     return new_image

# Author Detail Class model
class Author(models.Model):
    author_image = models.ImageField(upload_to="Images/Author_Profile_Image/", null=True, blank=True)
    author_name =  models.CharField(max_length=255,null=True,blank=True)
    author_age =  models.IntegerField(null=True,blank=True)
    writing_type = models.CharField(max_length=255, null=True,blank=True)
    users =  models.ForeignKey(User, on_delete=models.CASCADE,null=True, blank=True)
    is_deleted = models.BooleanField(null=True,blank=True)
    create_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
    def __str__(self):
        return self.author_name

    def image_tag(self):
        return mark_safe('<img src="/media/%s" style="text-align:center; width:50px; height:50px; border-radius:30px;">' % (self.author_image))
    
    image_tag.short_name = "Media"

    class Meta:
        db_table = "Author_Details"
        indexes = [
            models.Index(fields=['users']),
        ]
    # def save(self, *args, **kwargs):
    #     new_image = compress(self.author_image)
    #     self.author_image = new_image
    #     super().save(*args, **kwargs)

# language model
class Language(models.Model):
    language = models.CharField(max_length=255, null=True, blank=True)
    create_on = models.DateTimeField(auto_now_add=True,  null=True, blank=True)
    updated_on = models.DateTimeField(auto_now=True,  null=True, blank=True)

    def __str__(self):
        return self.language


# magazineinfo model
class MagazineInfo(models.Model):
    cover_pic = models.ImageField(upload_to='cover_pic/',null=True,blank=True)
    desktop_cover_pic = models.ImageField(upload_to='desktop_cover_pic/',null=True,blank=True)
    name = models.CharField(max_length=100,null=True,blank=True)
    ratting = models.FloatField(null=True,blank=True)
    rent_price = models.FloatField(null=True,blank=True)
    rent_date = models.CharField(max_length=20,null=True,blank=True)
    buy_price = models.FloatField(null=True,blank=True)
    system_category = models.ForeignKey(SystemCategory, on_delete=models.CASCADE,null=True,blank=True)
    # system_category = models.ManyToManyField(SystemCategory)
    # magazine_category = models.ManyToManyField(MagazineCategory)
    magazine_category = models.ForeignKey(MagazineCategory, on_delete=models.CASCADE,null=True,blank=True)
    magazine_type = models.CharField(max_length=20,null=True,blank=True)
    cover_price = models.CharField(max_length=20,null=True,blank=True)
    sku = models.IntegerField(null=True,blank=True)
    issues = models.IntegerField(null=True,blank=True)
    years_available = models.IntegerField(null=True,blank=True)
    umc = models.IntegerField(null=True,blank=True)
    subrate = models.CharField(max_length=20,null=True,blank=True)
    remit = models.CharField(max_length=20,null=True,blank=True)
    comment = models.TextField(max_length=500,null=True,blank=True)
    description = models.CharField(max_length=1500,null=True,blank=True)
    is_promoted = models.BooleanField(default=False)
    background_first_color = ColorField(default='#1877F2')
    background_second_color = ColorField(default='#F7A928')
    issue_date = models.DateField(null=True,blank=True)
    reads = models.IntegerField(null=True,blank=True)
    # author = models.ManyToManyField('Author')
    is_bookmark = models.BooleanField(default=False)
    is_favorite = models.BooleanField(default=False)
    is_read_status = models.BooleanField(default=False)
    author = models.ForeignKey(Author, on_delete=models.CASCADE,null=True,blank=True)
    published_date = models.DateTimeField(null=True,blank=True)
    language = models.ForeignKey(Language, on_delete=models.CASCADE,null=True,blank=True)
    CHOICE = (
    ("W", "Weekly"),
    ("M", "Monthly"),
    ("Q", "Quaterly"),
    ("H", "Half Yearly"),
    ("Y", "Yearly"),
             )
    frequency = models.CharField(max_length=50,choices=CHOICE,null=True,blank=True)
    create_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
    total_page = models.IntegerField(null=True,blank=True)
    # free_page = models.ManyToManyField('MegazinePages')
    # free_page = models.ForeignKey(MegazinePages, on_delete=models.CASCADE,null=True,blank=True)
    free_pages =models.CharField(max_length=50,null=True,blank=True)
    magazine_url = models.URLField(max_length = 200,null=True,blank=True)
    is_purchase = models.BooleanField(default=False)
    is_rented = models.BooleanField(default=False)
    is_subscription = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_aproved = models.BooleanField(null=True,blank=True)
    is_commission = models.BooleanField(default=True,null=True,blank=True)
    # currency =  models.ForeignKey(MasterCurrency, on_delete=models.CASCADE,null=True, blank=True)
    users =  models.ForeignKey(User, on_delete=models.CASCADE,null=True, blank=True)
    is_deleted = models.BooleanField(null=True,blank=True)

    def __str__(self):
        return self.name
    # def __unicode__(self):
    #         return (self.cover_pic)

    def image_tag(self):
        return mark_safe('<img src="/media/%s" style="text-align:center; width:50px; height:50px; border-radius:30px;">' % (self.cover_pic))

    
    class Meta:
        db_table = "Magazine_Info"
        indexes = [
            models.Index(fields=['users']),
        ]


# #magazine purchases model
# class MagazinePurchaseInfo(models.Model):
#     subscription = models.ForeignKey(SubscriptionType, on_delete=models.CASCADE, null=True, blank=True)
#     transaction_id = models.CharField(max_length=50,unique=True,null=True,blank=True)
#     currency = models.CharField(max_length=15,null=True,blank=True)
#     months = models.CharField(max_length=100,null=True,blank=True)
#     purchases_type = models.CharField(max_length=100,null=True,blank=True)
#     rent_date = models.DateTimeField(null=True, blank=True)
#     buy_date = models.DateTimeField(null=True, blank=True)
#     rent_price = models.FloatField(null=True,blank=True)
#     buy_price = models.FloatField(null=True,blank=True)
#     is_buyed = models.BooleanField(default=False)
#     is_rented = models.BooleanField(default=False)
#     is_subscription = models.BooleanField(default=False)
#     rent_expiry_date = models.DateTimeField(null=True, blank=True)
#     magazineInfos = models.ForeignKey(MagazineInfo, on_delete=models.CASCADE,null=True, blank=True)
#     users =  models.ForeignKey(User, on_delete=models.CASCADE,null=True, blank=True)
#     start_date = models.DateField(null=True,blank=True)
#     end_date = models.DateField(null=True,blank=True)
#     description = models.TextField(null=True,blank=True)
#     create_on = models.DateTimeField(auto_now_add=True)
#     updated_on = models.DateTimeField(auto_now=True)

#     class Meta:
#         db_table = "Magazine_Purchase_Info"
#         indexes = [
#             models.Index(fields=['users','magazineInfos','subscription']),
#         ]

#magazine page model
class MegazinePages(models.Model):
    page_number = models.IntegerField()
    pages = models.FileField(upload_to=f'Images/Pages/')
    magazine = models.ForeignKey(MagazineInfo,on_delete=models.CASCADE,null=True, blank=True)
    users =  models.ForeignKey(User, on_delete=models.CASCADE,null=True, blank=True)
    create_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
    class Meta:
        db_table = "Megazine_Pages"
        indexes = [
            models.Index(fields=['users','magazine']),
        ]

    
    # def __str__(self):
    #     return f"{self.magazine}'s_PageNumber_{self.page_number}"
    
    def image_tag(self):
        return mark_safe('<img src="/media/%s" style="text-align:center; width:50px; height:50px; border-radius:30px;">' % (self.pages))
  

#magazine Bookmark model
class MagazineBookmark(models.Model):
    magazines = models.ForeignKey(MagazineInfo,on_delete=models.CASCADE,null=True,blank=True)
    users =  models.ForeignKey(User, on_delete=models.CASCADE,null=True,blank=True)
    page_number = models.IntegerField(null=True,blank=True)
    bookmark_status = models.BooleanField(null=True,blank=True)
    create_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
    class Meta:
        db_table = "Magazine_Bookmark"
        indexes = [
            models.Index(fields=['users','magazines']),
        ]

#magazine Favorite model
class MagazineFavorite(models.Model):
    magazines = models.ForeignKey(MagazineInfo,on_delete=models.CASCADE,null=True,blank=True)
    users =  models.ForeignKey(User, on_delete=models.CASCADE,null=True,blank=True)
    page_number = models.IntegerField(null=True,blank=True)
    create_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
    class Meta:
        db_table = "Magazine_Favorite"
        indexes = [
            models.Index(fields=['users','magazines']),
        ]

# subscribtion model
class SearchMagazineinfo(models.Model):
    title = models.CharField(max_length=250,null=True,blank=True)
    count = models.IntegerField(default=1)
    magazineInfos = models.ForeignKey(MagazineInfo, on_delete=models.CASCADE,null=True, blank=True)

    class Meta:
        db_table = 'search_mgn_info'
        ordering = ['title']
        indexes = [
            models.Index(fields=['title', 'count',]),
        ]

# magazine offers model
class MagazineOfferinfo(models.Model):
    subscriptiontype = models.ForeignKey(SubscriptionType, on_delete=models.CASCADE, null=True, blank=True)
    users = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
    code = models.CharField(max_length=20,unique=True,null=True,blank=True)
    discount = models.CharField(max_length=20,null=True,blank=True)
    offer_status = models.BooleanField(default=True)
    price = models.FloatField(null=True,blank=True)
    amount = models.CharField(max_length=20,null=True,blank=True)
    max_discount = models.CharField(max_length=20,null=True,blank=True)
    start_date = models.DateField(null=True,blank=True)
    end_date = models.DateField(null=True,blank=True)
    for_users = models.CharField(max_length=250,null=True,blank=True)
    description = models.CharField(max_length=1000,null=True,blank=True)
    created_on = models.DateTimeField(auto_now_add=True, blank=True,null=True)
    updated_on = models.DateTimeField(auto_now=True)
    
    class Meta:
        db_table = "magazine_offerinfo"
        indexes = [
            models.Index(fields=['users','subscriptiontype']),
        ]

# # magazine order model
# class MagazineOrderinfo(models.Model):
#     magazines = models.ForeignKey(MagazineInfo,on_delete=models.CASCADE,null=True,blank=True)
#     users =  models.ForeignKey(User, on_delete=models.CASCADE,null=True,blank=True)
#     subscriptions = models.ForeignKey(Subscription,on_delete=models.CASCADE,null=True,blank=True)
#     magazineOffers =  models.ForeignKey(MagazineOfferinfo, on_delete=models.CASCADE,null=True,blank=True)
#     magazinePurchase =  models.ForeignKey(MagazinePurchaseInfo, on_delete=models.CASCADE,null=True,blank=True)
#     transaction_id = models.CharField(max_length=50,unique=True,null=True,blank=True)
#     # transaction = models.CharField(max_length=50,unique=True,null=True,blank=True)
#     start_date = models.DateField(null=True,blank=True)
#     end_date = models.DateField(null=True,blank=True)
#     description = models.CharField(max_length=250,null=True,blank=True)
#     created_on = models.DateTimeField(auto_now_add=True)
#     updated_on = models.DateTimeField(auto_now=True)

#     class Meta:
#         db_table = 'Magazine_Order_infos'
#         indexes = [
#             models.Index(fields=['magazines', 'users','subscriptions','magazineOffers','magazinePurchase']),
#         ]

# Magazine Review Info
class magazineReviewInfo(models.Model):
    magazines = models.ForeignKey(MagazineInfo,on_delete=models.CASCADE,null=True,blank=True)
    users =  models.ForeignKey(User, on_delete=models.CASCADE,null=True,blank=True)
    description = models.TextField(null=True, blank=True)
    ratting = models.FloatField(null=True,blank=True)
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'magazine_Review_Info'
        indexes = [
            models.Index(fields=['magazines', 'users']),
        ]
    
#magazine Commission model
class MagazineCommissionInfo(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE,null=True,blank=True)
    magazine_commission = models.PositiveIntegerField(null=True,blank=True)
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'Magazine_Commission_Info'
        unique_together = ['user','magazine_commission']
        indexes = [
            models.Index(fields=['user']),
        ]

# Magazine Read Status Model
class MagazineReadStatus(models.Model):
    magazine = models.ForeignKey(MagazineInfo,on_delete=models.CASCADE,null=True,blank=True)
    user =  models.ForeignKey(User, on_delete=models.CASCADE,null=True,blank=True)
    is_read_status = models.BooleanField(default=False)
    read_count = models.PositiveBigIntegerField(default=0)
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'Magazine_Read_Status'
        indexes = [
            models.Index(fields=['user','magazine']),
        ]

# Magazine Read Update Model
class MagazineReadUpdate(models.Model):
    magazine = models.ForeignKey(MagazineInfo,on_delete=models.CASCADE,null=True,blank=True)
    user =  models.ForeignKey(User, on_delete=models.CASCADE,null=True,blank=True)
    status = models.BooleanField(default=False)
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'Magazine_Read_Update'
        indexes = [
            models.Index(fields=['user','magazine']),
        ]

# magazine map author model
class MagMapAuthor(models.Model):
    magazine = models.ForeignKey(MagazineInfo, on_delete=models.CASCADE,null=True, blank=True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE,null=True,blank=True)
    class Meta:
        db_table = 'magazine_map_author'
        indexes = [
            models.Index(fields=['author','magazine']),
        ]
    
# User map offer model
class UserMapOffer(models.Model):
    magazineoffer = models.ForeignKey(MagazineOfferinfo, on_delete=models.CASCADE,null=True, blank=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE,null=True,blank=True)
    class Meta:
        db_table = 'user_map_offer'
        unique_together = ['user','magazineoffer']
        indexes = [
            models.Index(fields=['magazineoffer','user']),
        ]

#magazine purchases model
class MagazinePurchaseInfo(models.Model):
    subscriptions = models.ForeignKey(Subscription,on_delete=models.CASCADE,null=True,blank=True)
    subscription = models.ForeignKey(SubscriptionType, on_delete=models.CASCADE, null=True, blank=True)
    transaction_id = models.CharField(max_length=50,unique=True,null=True,blank=True)
    purchases_order_id = models.CharField(max_length=50,unique=True,null=True,blank=True)
    currency = models.CharField(max_length=15,null=True,blank=True)
    magazineOffer =  models.ForeignKey(MagazineOfferinfo, on_delete=models.CASCADE,null=True,blank=True)
    offer_code = models.CharField(max_length=20,null=True,blank=True)
    offer_max_amount = models.CharField(max_length=20,null=True,blank=True)
    offer_discount_amount = models.CharField(max_length=20,null=True,blank=True)
    offer_discount = models.CharField(max_length=20,null=True,blank=True)
    months = models.CharField(max_length=100,null=True,blank=True)
    purchases_type = models.CharField(max_length=100,null=True,blank=True)
    rent_date = models.DateTimeField(null=True, blank=True)
    buy_date = models.DateTimeField(null=True, blank=True)
    delivery_date = models.DateTimeField(null=True, blank=True)
    delivery_location = models.CharField(max_length=100,null=True,blank=True)
    rent_price = models.FloatField(null=True,blank=True)
    buy_price = models.FloatField(null=True,blank=True)
    offer_price = models.FloatField(null=True,blank=True)
    subscription_price = models.FloatField(null=True,blank=True)
    is_offered = models.BooleanField(default=False)
    is_buyed = models.BooleanField(default=False)
    is_rented = models.BooleanField(default=False)
    is_subscription = models.BooleanField(default=False)
    is_hard_copy = models.BooleanField(default=False)
    is_delivered = models.CharField(max_length=1,null=True,blank=True)
    image = models.ImageField(upload_to='image/',null=True,blank=True)
    hard_copy_price = models.FloatField(null=True,blank=True)
    rent_expiry_date = models.DateTimeField(null=True, blank=True)
    magazineInfos = models.ForeignKey(MagazineInfo, on_delete=models.CASCADE,null=True, blank=True)
    users =  models.ForeignKey(User, on_delete=models.CASCADE,null=True, blank=True)
    start_date = models.DateField(null=True,blank=True)
    end_date = models.DateField(null=True,blank=True)
    # offer_record = models.TextField(null=True, blank=True)
    description = models.TextField(null=True,blank=True)
    create_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
    subscription_user_status = models.BooleanField(default=True)
    # count = models.IntegerField(default=1)
    # is_expired = models.BooleanField(default=False,null=True,blank=True)
    status = models.CharField(max_length=20,null=True,blank=True)


    class Meta:
        db_table = "Magazine_Purchase_Info"
        indexes = [
            models.Index(fields=['users','magazineInfos','subscription']),
        ]


# magazine order model
class MagazineOrderinfo(models.Model):
    magazines = models.ForeignKey(MagazineInfo,on_delete=models.CASCADE,null=True,blank=True)
    users =  models.ForeignKey(User, on_delete=models.CASCADE,null=True,blank=True)
    subscriptions = models.ForeignKey(Subscription,on_delete=models.CASCADE,null=True,blank=True)
    magazineOffers =  models.ForeignKey(MagazineOfferinfo, on_delete=models.CASCADE,null=True,blank=True)
    magazinePurchase =  models.ForeignKey(MagazinePurchaseInfo, on_delete=models.CASCADE,null=True,blank=True)
    transaction_id = models.CharField(max_length=50,unique=True,null=True,blank=True)
    # transaction = models.CharField(max_length=50,unique=True,null=True,blank=True)
    start_date = models.DateField(null=True,blank=True)
    end_date = models.DateField(null=True,blank=True)
    description = models.CharField(max_length=250,null=True,blank=True)
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'Magazine_Order_infos'
        indexes = [
            models.Index(fields=['magazines', 'users','subscriptions','magazineOffers','magazinePurchase']),
        ]


# withdrawal details
class WithdrawalDetails(models.Model):
    user =  models.ForeignKey(User, on_delete=models.CASCADE,null=True,blank=True)
    role = models.ForeignKey(Role, on_delete=models.CASCADE, null=True, blank=True)
    withdrawal_amount = models.FloatField(null=True,blank=True)
    current_amount = models.FloatField(null=True,blank=True)
    total_amount = models.FloatField(null=True,blank=True)
    name = models.CharField(max_length=250,null=True,blank=True)
    mobile_number = models.CharField(max_length=15,null=True,blank=True)
    bank_account_number = models.CharField(max_length=16,null=True,blank=True)
    bank_name = models.CharField(max_length=250,null=True,blank=True)
    mcr_code = models.CharField(max_length=50,null=True,blank=True)
    swift_code = models.CharField(max_length=15,null=True,blank=True)
    ifsc_code = models.CharField(max_length=15,null=True,blank=True)
    is_aproved = models.BooleanField(null=True,blank=True)
    admin_image = models.ImageField(upload_to='admin_image/',null=True,blank=True)
    comment = models.CharField(max_length=250,null=True,blank=True)
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'withdrawal_details'
        indexes = [
            models.Index(fields=['user','role']),
        ]


# magazine Image model
class MagazineImage(models.Model):
    image = models.ImageField(upload_to='image/',null=True,blank=True)
    magazine = models.ForeignKey(MagazineInfo,on_delete=models.CASCADE,null=True,blank=True)

    class Meta:
        db_table = 'magazine_image'
        indexes = [
            models.Index(fields=['magazine',]),
        ]

## Blogs Model

# from froala_editor.fields import FroalaField
class Blogs(models.Model):
    title=models.CharField(max_length=250,null=True,blank=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
    category = models.ForeignKey(MagazineCategory, on_delete=models.CASCADE, null=True, blank=True)
    cover_image = models.ImageField(upload_to='blog_cover',null=True,blank=True)
    # content = FroalaField()
    content = models.TextField(null=True, blank=True)
    is_deleted = models.BooleanField(default=False,null=True,blank=True)
    is_active = models.BooleanField(default=True)
    is_aproved = models.BooleanField(null=True,blank=True)
    created_on = models.DateTimeField(auto_now_add=True, blank=True,null=True)
    updated_on = models.DateTimeField(auto_now=True)
    

    class Meta:
        db_table = "blogs"
        indexes = [
            models.Index(fields=['title','user']),
        ]
    

## BlogsImages Model
class BlogsImages(models.Model):
    blog = models.ForeignKey(Blogs, on_delete=models.CASCADE, null=True, blank=True)
    image = models.ImageField(upload_to='blogsimages/',null=True,blank=True)
    files = models.FileField(upload_to='blogsfiles/',null=True,blank=True)
    created_on = models.DateTimeField(auto_now_add=True, blank=True,null=True)
    updated_on = models.DateTimeField(auto_now=True)


    class Meta:
        db_table = "BlogsImages"
        indexes = [
            models.Index(fields=['blog']),
        ]
