from django.db import models



# Customers
class Customer(models.Model):
    
    first_name = models.CharField(max_length=100, null=True, blank=True)
    last_name = models.CharField(max_length=20,default='')
    contact = models.CharField(max_length=100, null=True, blank=True)
    phone_no = models.CharField(max_length=100, null=True, blank=True)
    fax_no = models.CharField(max_length=100, null=True, blank=True)
    email = models.CharField(max_length=100, null=True, blank=True)
    street = models.CharField(max_length=255, null=True, blank=True)
    address = models.CharField(max_length=255, null=True, blank=True)

    is_deleted = models.BooleanField(default=False)
    created_at = models.DateField(auto_now=True)

    def __str__(self):
        return self.last_name
    

    # for json 
    def get_data(self):
        return{
            'id': self.id,
            'name': self.first_name,
            'phone': self.phone_no,
            'email': self.email,
            'fax': self.fax_no,
            'street': self.street,
            'address': self.address,
        }


# Sale Rep    
class Sale_Rep(models.Model):

    name = models.CharField(max_length=100, null=True, blank=True)
    phone_no = models.CharField(max_length=100, null=True, blank=True)
    email = models.CharField(max_length=100, null=True, blank=True)

    is_deleted = models.BooleanField(default=False)
    created_at = models.DateField(auto_now=True)

    def __str__(self):
        return self.name


# Sale Rep    
class Default_Config(models.Model):

    name = models.CharField(max_length=100, null=True, blank=True)
    street = models.CharField(max_length=100, null=True, blank=True)
    address = models.CharField(max_length=100, null=True, blank=True)
    phone_no = models.CharField(max_length=100, null=True, blank=True)
    fax = models.CharField(max_length=100, null=True, blank=True)
    email = models.CharField(max_length=100, null=True, blank=True)
    created_at = models.DateField(auto_now=True)

    def __str__(self):
        return self.name

class Shipping_Address(models.Model):

    customer = models.ForeignKey(Customer, on_delete=models.PROTECT)
    contact = models.CharField(max_length=100, null=True, blank=True)
    street = models.CharField(max_length=100, null=True, blank=True)
    address = models.CharField(max_length=100, null=True, blank=True)
    created_at = models.DateField(auto_now=True)

    def __str__(self):
        return self.address

    
class Billing_Address(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.PROTECT)
    address = models.CharField(max_length=100, null=True, blank=True)
    created_at = models.DateField(auto_now=True)

    def __str__(self):
        return self.address

# Customer can have multiple work_sites
class Work_Site(models.Model):

    customer = models.ForeignKey(Customer, on_delete=models.PROTECT)
    contact = models.CharField(max_length=100, null=True, blank=True)
    street = models.CharField(max_length=100, null=True, blank=True)
    address = models.CharField(max_length=255, null=True, blank=True)
    start_date = models.DateField(null=True, blank=True)

    is_deleted = models.BooleanField(default=False)
    created_at = models.DateField(auto_now=True)

    def __str__(self):
        return self.street
    
    # for json 
    def get_data(self):
        return{
            'id': self.id,
            'name': self.customer.first_name,
            'phone': self.customer.phone_no,
            'email': self.customer.email,
            'street': self.street,
            'address': self.address,
        }
    
# Unit    
class Unit(models.Model):
    refunit = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True, related_name='refunitname')
    name = models.CharField(max_length=100, null=True, blank=True)
    conversion_rate = models.FloatField(null=True, blank=True)
    created_at = models.DateField(auto_now=True)

    def __str__(self):
        return self.name
# Product categories
class Product_Category(models.Model):
    name = models.CharField(max_length=100, null=True, blank=True)
    created_at = models.DateField(auto_now=True)

    def __str__(self):
        return self.name

# Products
class Product(models.Model):
    temp_unit_id = models.IntegerField(default=0, null=True)

    category = models.ForeignKey(Product_Category, on_delete=models.CASCADE, related_name='product')
    name = models.TextField(null=True,blank=True)
    code_id = models.CharField(max_length=20, null=True, blank=True)
    unit = models.ForeignKey(Unit, on_delete=models.CASCADE, null=True)
    percent_imp = models.FloatField(null=True, blank=True)
    price = models.FloatField(null=True, blank=True)
    qty = models.FloatField(default=1)
    description = models.TextField(null=True,blank=True)

    is_deleted = models.BooleanField(default=False)
    created_at = models.DateField(auto_now=True)

    def __str__(self):
        return self.name
    

    # json 
    def get_data(self):
        unit = None
        if self.unit:
            unit = self.unit.name
        return{
            'id': self.id,
            'name': self.name,
            'code': self.code_id,
            'unit': unit,
            'price': self.price,
            'category': self.category.name,
            'stock': self.qty,
        }

# Quotation
class Quotation(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    work_site = models.ForeignKey(Work_Site, on_delete=models.CASCADE)
    sale_rep = models.ForeignKey(Sale_Rep, on_delete=models.CASCADE, null=True, blank=True)
    description = models.CharField(max_length=100, null=True, blank=True)
    status = models.CharField(max_length=100, null=True, blank=True)
    term = models.CharField(max_length=100, null=True, blank=True)
    # sale_rep = models.CharField(max_length=100, default='Dunrite Glass Window')
    status = models.CharField(max_length=20, default='Pending')
    shipping_address = models.ForeignKey(Shipping_Address, on_delete=models.CASCADE, null=True)
    billing_address = models.ForeignKey(Billing_Address, on_delete=models.CASCADE, null=True)
    shipment_date = models.DateField(null=True)
    note = models.TextField(null=True, blank=True)
    
    sub_total = models.FloatField(null=True)
    discount = models.FloatField(null=True)
    deposit = models.FloatField(null=True)
    sale_tax = models.FloatField(null=True)
    energy_surcharge = models.FloatField(null=True)
    paid = models.FloatField(null=True)
    balance = models.FloatField(null=True)
    total = models.FloatField(null=True)

    is_pending = models.BooleanField(default=True)
    is_paid = models.BooleanField(default=False)
    service_date = models.DateField(null=True, blank=True)
    created_at = models.DateField(auto_now=True)

    def __str__(self):
        return self.customer.first_name

# Quotation Details
class Quotation_Detail(models.Model):
    quotation = models.ForeignKey(Quotation, on_delete=models.CASCADE, related_name='detail')
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='product')
    width = models.FloatField(null=True)
    height = models.FloatField(null=True)
    qty = models.FloatField(null=True)
    amount = models.FloatField(null=True)
    total = models.FloatField(null=True)


# Invoices
class Invoice(models.Model):
    quotation = models.OneToOneField(Quotation, on_delete=models.CASCADE, null=True, related_name='invoice')
    customer = models.ForeignKey(Customer, on_delete=models.PROTECT, null=True)
    work_site = models.ForeignKey(Work_Site, on_delete=models.PROTECT, null=True)
    sale_rep = models.ForeignKey(Sale_Rep, on_delete=models.CASCADE, null=True, blank=True)
    description = models.CharField(max_length=100, null=True, blank=True)
    status = models.CharField(max_length=100, null=True, blank=True)
    term = models.CharField(max_length=100, null=True, blank=True)
    # sale_rep = models.CharField(max_length=100, default='Dunrite Glass Window')
    # shipping_address = models.ForeignKey(Shipping_Address, on_delete=models.CASCADE, null=True)
    # billing_address = models.ForeignKey(Billing_Address, on_delete=models.CASCADE, null=True)
    billing_address = models.CharField(max_length=255, null=True, blank=True)
    shipment_date = models.DateField(null=True)
    note = models.TextField(null=True, blank=True)
    
    sub_total = models.FloatField(default=0)
    discount = models.FloatField(default=0)
    deposit = models.FloatField(default=0)
    sale_tax = models.FloatField(default=0)
    energy_surcharge = models.FloatField(default=0)
    balance = models.FloatField(default=0)
    paid = models.FloatField(default=0)
    total = models.FloatField(default=0)

    is_pending = models.BooleanField(default=True)
    is_paid = models.BooleanField(default=False)
    service_date = models.DateField(null=True, blank=True)
    created_at = models.DateField(null=True)
    # created_at = models.DateField(auto_now=True)

    def __str__(self):
        return self.customer.first_name
    
    # for json 
    def get_data(self):
        return{
            'id': self.id,
            'name': self.customer.first_name,
            'phone': self.customer.phone_no,
            'email': self.customer.email,
            'total': self.total,
            'balance': self.balance,
            'created_at': self.created_at,
        }

# Invoice Details
class Invoice_Detail(models.Model):

    invoice = models.ForeignKey(Invoice, on_delete=models.CASCADE, related_name='detail')
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='invoice_product')
    width = models.FloatField(null=True)
    description = models.CharField(max_length=100, null=True, blank=True)
    height = models.FloatField(default=0)
    qty = models.FloatField(default=0)
    units = models.FloatField(default=0) #unit
    amount = models.FloatField(default=0) #price
    total = models.FloatField(default=0)

# Invoice Payments
class Invoice_Payment(models.Model):
    invoice = models.ForeignKey(Invoice, on_delete=models.CASCADE, related_name='payment')
    type = models.CharField(max_length=100, null=True, blank=True)
    message = models.CharField(max_length=255, null=True, blank=True)
    card_holder_name = models.CharField(max_length=100, null=True, blank=True)
    card_no = models.CharField(max_length=100, null=True, blank=True)
    paid_amount = models.FloatField(null=True)
    created_at = models.DateField(auto_now=True)


    
