from django.db import models
from ckeditor.fields import RichTextField
from location.models import Location
from locality.models import Locality
from builder.models import Builder
from addons.models import *
from multiselectfield import MultiSelectField
from addons.options import (PROJECT_TYPE,PROJECT_STATUS,PROJECT_AREA,DETAIL_TRANSACTION_TYPE,DETAIL_FLOORING,DETAIL_FURNISHING,DETAIL_PARKING)
from PIL import Image
import sys
from io import BytesIO
from django.core.files.uploadedfile import InMemoryUploadedFile
from imagekit.models import ImageSpecField
from imagekit.processors import ResizeToFill
from django.urls import reverse
# Create your models here.

class Category(models.Model):
    name=models.CharField(max_length=64, default=None,
                        verbose_name="Category Name",
                        help_text=f"Values: Enter Category Name.")
    slug=models.SlugField(max_length=128, unique=True,
                        default=None,
                        verbose_name="Category Slug",
                        help_text=f"Values: Enter Category Slug.")
    title=models.CharField(max_length=128, default=None,
                        verbose_name="Category Title",
                        help_text=f"Values: Enter Category Meta Title.")
    description=models.TextField(max_length=165, default=None,
                        verbose_name="Category Description",
                        help_text=f"Values: Enter Category Meta Description.")
    keyword=models.CharField(max_length=255, null=True, blank=True,
                        verbose_name="Category Keyword",
                        help_text=f"Values: Enter Category Meta Keywords.")
    header_content=RichTextField(null=True, 
                            blank=True, 
                            verbose_name='Category Header Content',
                            help_text=f" Values: Category Header Content")
    footer_content=RichTextField(null=True, 
                            blank=True, 
                            verbose_name='Category Footer Content',
                            help_text=f" Values: Category Footer Content")                     
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = "Category"


class SubCategory(models.Model):
    category = models.ForeignKey(Category, 
                            related_name='subcategories', 
                            on_delete=models.CASCADE, 
                            default=None,
                            help_text=f"Type: Int, Values: Select Category")
    name=models.CharField(max_length=32,
                            default=None,
                            verbose_name="Sub Category Name",
                            help_text=f"Type: Int, Values: Enter Name")
    slug=models.SlugField(max_length=32, unique=True,default=None,
                            verbose_name="Sub Category Slug",
                            help_text=f"Type: Int, Values: Enter Slug")
    title=models.CharField(max_length=128, default=None,
                        verbose_name="Category Title",
                        help_text=f"Values: Enter Sub Category Meta Title.")
    description=models.TextField(max_length=165, default=None,
                        verbose_name="Sub Category Description",
                        help_text=f"Values: Enter Category Meta Description.")
    keyword=models.CharField(max_length=255, null=True, blank=True,
                        verbose_name="Sub Category Keyword",
                        help_text=f"Values: Enter Category Meta Keywords.")
    header_content=RichTextField(null=True, 
                            blank=True, 
                            verbose_name='Sub Category Header Content',
                            help_text=f" Values: Sub Category Header Content")
    footer_content=RichTextField(null=True, 
                            blank=True, 
                            verbose_name='Sub Category Footer Content',
                            help_text=f" Values: Sub Category Footer Content")   
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

class SubChildCategory(models.Model):
    subcategory = models.ForeignKey(SubCategory, 
                                related_name='subchild', 
                                on_delete=models.CASCADE, 
                                default=None,
                                verbose_name="Select Sub Category",
                                help_text=f"Type: Int, Values: Select Sub Category")
    name=models.CharField(max_length=32,
                            default=None,
                            verbose_name="Sub Child Category Name",
                            help_text=f"Type: Int, Values: Enter Name")
    slug=models.SlugField(max_length=32, unique=True,
                            default=None,
                            verbose_name="Sub Child Category Slug",
                            help_text=f"Type: Int, Values: Enter Slug")
    title=models.CharField(max_length=85,default=None,
                            verbose_name="Sub Category Title",
                            help_text=f"Type: Int, Values: Enter Meta Title")
    description=models.TextField(max_length=165, default=None,
                            verbose_name="Category Description",
                            help_text=f"Type: String, Values: Enter Meta Description.")
    keyword=models.CharField(max_length=255, null=True, blank=True,
                                verbose_name="Category Keyword",
                                help_text=f"Type: String, Values: Enter Meta Keywords.")
    header_content=RichTextField(null=True, 
                            blank=True, 
                            verbose_name='Sub Category Header Content',
                            help_text=f" Values: Sub Category Header Content")
    footer_content=RichTextField(null=True, 
                            blank=True, 
                            verbose_name='Sub Category Footer Content',
                            help_text=f" Values: Sub Category Footer Content")   
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

class Amenity(models.Model):
    amenity_name=models.CharField(max_length=120, default=None)
    amenity_icon=models.CharField(max_length=120, null=True, blank=True)

    def __str__(self):
        return self.amenity_name

class Project(models.Model):
    category = models.ManyToManyField(SubCategory, 
                                        verbose_name='Select Category', 
                                        related_name='PROJECTCATEGORY')
    builder = models.ForeignKey(Builder, 
                                related_name='builders', 
                                on_delete=models.CASCADE, 
                                null=True, 
                                blank=True, 
                                verbose_name='Select Builder',
                                help_text=f"Type: Int, Values: Select Builder.")
    locality = models.ForeignKey(Locality, 
                                    related_name='localities', 
                                    on_delete=models.CASCADE,
                                    verbose_name='Select Locality',
                                    help_text=f"Type: Int, Values: Select Locality Name.")
    city = models.ForeignKey(City, 
                                related_name='propcity', 
                                on_delete=models.CASCADE,
                                verbose_name='Select City',
                                help_text=f"Type: Int, Values: Select City Name.")
    
    location = models.ForeignKey(Location, 
                                related_name='proplocation', 
                                on_delete=models.CASCADE, 
                                verbose_name='Select Location',
                                help_text=f"Type: Int, Values: Select Location.")
    amenity = models.ManyToManyField(Amenity,
                                    verbose_name="Select Project Amenity", 
                                    related_name='ProjectAmenity')
    name=models.CharField(null=True, 
                          max_length=114,
                          help_text=f"Type: string, Values: Enter Project Name.")
    slug=models.SlugField(null=True, 
                          unique=True,
                          max_length=114,
                          help_text=f"Type: string, Values: Enter Project Slug.")
    # project_types = MultiSelectField(choices=PROJECT_TYPE, 
    #                                 null=True, blank=True,
    #                                 help_text=f"Value: Select Project Type")
    isFeatured = models.BooleanField(default=0, verbose_name="Check for Featured Project")
    premium = models.BooleanField(default=0, verbose_name="Check for Premium Project")
    status = models.BooleanField(default=1, verbose_name="Check Status Active/In-Active",)
    title = models.CharField(max_length=165, 
                                  null=True, 
                                  blank=True, 
                                  verbose_name='Meta Title',
                                  help_text=f"Type: string, Default: null, Values: Project Meta Title.")
    description = models.TextField(max_length=255, 
                                null=True, blank=True, 
                                verbose_name='Meta Description',
                                help_text=f"Type: string, Default: null, Values: Project Meta Description.")
    keyword = models.CharField(max_length=165, 
                                null=True, blank=True, 
                                verbose_name='Meta Keyword',
                                help_text=f"Type: string, Default: null, Values: Project Meta Keyword.")

    overview=RichTextField(null=True, 
                                        blank=True, 
                                        verbose_name='Project Description',
                                        help_text=f"Type: string, Default: null, Values: Project Description.")
    paymentplan = RichTextField(null=True, 
                                        blank=True, 
                                        verbose_name='Payment Plan',
                                        help_text=f"Type: string, Default: null, Values: Project Payment Plan.")

    keyfeatures = RichTextField(null=True, 
                                        blank=True, 
                                        verbose_name='Key Features',
                                        help_text=f"Type: string, Default: null, Values: Project Key Features.")
    location_advantages = RichTextField(null=True, 
                                    blank=True, 
                                    verbose_name='Location Advantages',
                                    help_text=f"Type: string, Default: null, Values: Project Location Advantages.")
    location_image=models.ImageField(upload_to='location_image/%Y/%m/%d', 
                                    null=True, 
                                    blank=True,
                                    max_length=255,
                                    help_text=f"Type: string, Default: null, Values: Upload Location Image."
                                    )
    sitemap_image=models.ImageField(upload_to='sitemap_image/%Y/%m/%d', 
                                    null=True, 
                                    blank=True,
                                    max_length=255,
                                    help_text=f"Type: string, Default: null, Values: Upload SiteMap Image."
                                    )
    project_thumb=models.ImageField(upload_to='project_thumb/%Y/%m/%d', 
                                    null=True, 
                                    blank=True,
                                    max_length=255,
                                    help_text=f"Values: Upload Project Main Image."
                                    )
    def save(self):
        super().save()
        if self.project_thumb:
            thump_img= Image.open(self.project_thumb.path)
            if thump_img.width> 300 or thump_img.height > 200:
                # new_image = (328,250)
                # thump_img.thumbnail(new_image)
                thump_img = thump_img.resize((328, 250))
                thump_img.save(self.project_thumb.path)
            else:
                print("not find img")    
        else:
            print("Not find any images")
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = 'Project'

    def get_absolute_url(self):
        return reverse('project:project_view', kwargs={'slug': self.slug})

class Detail(models.Model):
    project = models.OneToOneField(Project, related_name='project_details', on_delete=models.CASCADE)
    possession = models.CharField(null=True, max_length=8,
                                blank=True,
                                choices=PROJECT_STATUS,
                                verbose_name="Project Possession",
                                help_text=f"Type: int, Values: Select Project Status")
    minarea = models.CharField(null=True, max_length=32,
                                blank=True, 
                                verbose_name='Minimum Area', 
                                help_text=f"Type: Int, Values: Enter Minimum Area.")

    areaselect = models.CharField(default=0, max_length=8,
                                verbose_name="Select Project Area",
                                choices=PROJECT_AREA,
                                help_text=f"Type: Int, Default:0, Values: Select One"
                                )

    project_area_type = models.CharField(default=9, max_length=8,
                                    choices=PROJECT_AREA,
                                    verbose_name="Total Land Area",
                                    help_text=f"Type: Int, Default: 9, Values: Select Project Area.")

    maxarea = models.CharField(max_length=32, null=True, 
                                blank=True, 
                                verbose_name='Maximum Area',
                                help_text=f"Type: Int, Values: Enter Maximum Area")

    minprice = models.IntegerField(null=True,
                                blank=True,
                                verbose_name="Minimum Price",
                                help_text=f"Type: Int, Values: Enter Minimum Price")
    
    
    maxprice = models.IntegerField(null=True,
                                blank=True, 
                                verbose_name='Maximum Price',
                                help_text=f"Type: Int, Values: Enter Maximum Price")                            

    towers = models.IntegerField(null=True,
                                blank=True, 
                                verbose_name='Total Towers',
                                help_text=f"Type: Int, Values: Total Towers")

    floors = models.IntegerField(null=True, 
                            blank=True, 
                            verbose_name='Total Floors',
                            help_text=f"Type: Int, Values: Total Floors")

    rera=models.CharField(max_length=96, 
                        null=True, 
                        blank=True, 
                        verbose_name='Rera Number',
                        help_text=f"Type: String, Values: Enter Rera Number")

    sqft_area=models.CharField(max_length=285, null=True, blank=True)
    unites = models.IntegerField(null=True, 
                            blank=True, 
                            verbose_name='Total Units',
                            help_text=f"Type: Int, Values: Enter Total Project Units")

    total_area = models.FloatField(null=True, 
                            blank=True, 
                            verbose_name='Total Area',
                            help_text=f"Type: Int, Values: Enter Total Project Area")

    cheque_favour_of = models.CharField(max_length=64,
                            null=True, 
                            blank=True, 
                            verbose_name='Favour Of',
                            help_text=f"Type: String, Values: Enter Cheque in Favour Of")

    available_from = models.DateField(verbose_name='Available From', 
                                    null=True, 
                                    blank=True,
                                    help_text=f"Type: String, Values: Enter Project Possession Date.")

    launch_date = models.DateField(verbose_name='Launch Date', 
                                    null=True, 
                                    blank=True,
                                    help_text=f"Type: String, Values: Enter Project Launch Date.")

    transaction_type = models.CharField(null=True, max_length=8,
                                        blank=True, 
                                        choices=DETAIL_TRANSACTION_TYPE,
                                        help_text=f"Type: Int, Values: Select One")

    flooring=models.CharField(null=True, blank=True, max_length=64,
                                choices=DETAIL_FLOORING,
                                verbose_name="Project Flooring",
                                help_text=f"Type: Int, Values: Select Flooring")

    furnishing=models.CharField(null=True, blank=True, max_length=8,
                                choices=DETAIL_FURNISHING,
                                verbose_name="Furnishing Type",
                                help_text=f"Type: Int, Values: Select Furnishing")
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.project.name   

    # @property
    # def yearmonth(self):
    #     return self.available_from.strftime('%B, %Y')

    @property                            
    def min_price_tag(self):
        if self.minprice is None:
            print('No Price Match')
        else:
            if self.minprice >=1000 and self.minprice <=99999:
                self.minprice=self.minprice//1000
                return f"{self.minprice} K"  
            elif self.minprice>=100000 and self.minprice<=9999999:
                self.minprice=self.minprice//100000
                return f"{self.minprice} Lac" 
            else:
                self.minprice=self.minprice/10000000
                return f'{self.minprice} Cr'
            return str(self.minprice) if self.minprice is not None else ""    

    @property                            
    def max_price_tag(self):
        if self.maxprice is None:
            print('NO Price Match')
        else:
            if self.maxprice >=1000 and self.maxprice <=99999:
                self.maxprice=self.maxprice//1000
                return f"{self.maxprice} K"  
            elif self.maxprice>=100000 and self.maxprice<=9999999:
                self.maxprice=self.maxprice//100000
                return f"{self.maxprice} Lac" 
            else:
                self.maxprice=self.maxprice/10000000
                return f'{self.maxprice} Cr'
            return str(self.maxprice) if self.maxprice is not None else "" 

class ProjectImages(models.Model):
    project=models.ForeignKey(Project, related_name='PROJECTIMAGE', default=None, on_delete=models.CASCADE)
    title=models.CharField(max_length=100, null=True, blank=True)
    project_image=models.ImageField(upload_to='project_images/%Y/%m/%d')
    project_thumb = ImageSpecField(source='project_image',
                                      processors=[ResizeToFill(426, 320)],
                                      format='JPEG',
                                      options={'quality': 50})
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.project.name

    def save(self, *args, **kwargs):
        if not self.id:
            self.project_image = self.compressImage(self.project_image)
        super(ProjectImages, self).save(*args, **kwargs)

    def compressImage(self,project_image):
        imageTemproary = Image.open(project_image)
        if imageTemproary.mode in ("RGBA", "P"):
            imageTemproary = imageTemproary.convert("RGBA")
        outputIoStream = BytesIO()
        imageTemproaryResized = imageTemproary.resize( (1000,500) ) 
        imageTemproaryResized.save(outputIoStream , format='JPEG', quality=60)
        outputIoStream.seek(0)
        project_image = InMemoryUploadedFile(outputIoStream,'ImageField', "%s.jpg" % project_image.name.split('.')[0], 'image/jpeg', sys.getsizeof(outputIoStream), None)
        return project_image

    @property
    def imageURL(self):
        try:
            url = self.project_image.url
        except:
            url = ''
        return url

class ProjectFloorPlan(models.Model):
    project=models.ForeignKey(Project, related_name='PROJECTFLOORPLAN', on_delete=models.CASCADE, default=None)
    floorplan_image=models.ImageField(upload_to='floorplan_image/%Y/%m/%d', null=True, blank=True)
    bhk=models.CharField(max_length=100, null=True, blank=True, help_text=f"Type: String, Values: Enter Value")
    size = models.CharField(max_length=100, null=True, blank=True, help_text=f"Type: String, Values: Enter Value")
    price = models.CharField(max_length=100, null=True, blank=True, help_text=f"Type: String, Values: Enter Value")
    price_persqft = models.IntegerField(null=True, blank=True, help_text=f"Type: String, Values: Enter Value")
    booking_amount=models.CharField(max_length=100, null=True, blank=True, help_text=f"Type: String, Values: Enter Value")
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.project.name

    @property                            
    def floorplan_price(self):
        if self.price is None:
            print('No Price Match')
        else:
            if int(self.price) >= 1000 and int(self.price) <= 99999:
                self.price=self.price//1000
                return f"{self.price} K"  
            elif int(self.price) >= 100000 and int(self.price) <= 9999999:
                self.price=int(self.price)//100000
                return f"{self.price} Lac" 
            else:
                self.price= int(self.price)/10000000
                return f'{self.price} Cr'
            return str(self.price) if self.price is not None else ""    

    def save(self, *args, **kwargs):
        if not self.id:
            self.floorplan_image = self.compressImage(self.floorplan_image)
        super(ProjectFloorPlan, self).save(*args, **kwargs)

    def compressImage(self,floorplan_image):
        imageTemproary = Image.open(floorplan_image)
        if imageTemproary.mode in ("RGBA", "P"):
            imageTemproary = imageTemproary.convert("RGBA")
        outputIoStream = BytesIO()
        imageTemproaryResized = imageTemproary.resize( (800,600) ) 
        imageTemproaryResized.save(outputIoStream , format='JPEG', quality=80)
        outputIoStream.seek(0)
        floorplan_image = InMemoryUploadedFile(outputIoStream,'ImageField', "%s.jpg" % floorplan_image.name.split('.')[0], 'image/jpeg', sys.getsizeof(outputIoStream), None)
        return floorplan_image

class Offers(models.Model):
    project = models.ForeignKey(Project,
                            on_delete=models.CASCADE, 
                            default=None,
                            related_name='ProjectOffers',
                            help_text=f"Type: String, Values: Select Any Project.")
    
    offer_type = models.CharField(default=None, 
                                max_length=165, 
                                help_text=f"Type:String, values: Enter Offer Type")

    offer1 = models.CharField(null=True, 
                            blank=True,
                            max_length=165,
                            help_text=f"Type:String, values: Enter Offer 1")
                            
    offer2 = models.CharField(null=True, 
                            blank=True,
                            max_length=165,
                            help_text=f"Type:String, values: Enter Offer 2")

    offer_ends_date=models.DateField(null=True, blank=True, verbose_name='Offer Ends Date')
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.offer_type