from django.db import models

# Create your models here.
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
import re
from human_resource.models import StaffProfile

from system_administration.models import CompanyBranch, CompanyProfile
from warehouse_management.models import Product, PurchaseRequisition, PurchaseRequisitionInstance, StockRequisitionInstance

class Supplier(models.Model):
    user = models.OneToOneField(
        User, null=True, on_delete=models.CASCADE, related_name="user_supplier_profile")
    company_profile = models.ForeignKey(
        CompanyProfile, null=True, on_delete=models.CASCADE, related_name="company_suppliers")
    supplier_name = models.CharField(max_length=100, default="",)
    supplier_phone = models.CharField(max_length=15,)
    supplier_email = models.EmailField(max_length=50, default="", blank=False)
    supplier_address = models.CharField(max_length=100,default="")
    supplied_products = models.ManyToManyField(
        Product, blank=True, related_name="supplier_products")
    supplier_description = models.CharField(
        max_length=500, default="",blank=True)
    supplier_category = models.CharField(
        max_length=30, default="secondary", blank=True)
    created_by = models.ForeignKey(
        StaffProfile, null=True, on_delete=models.SET_NULL, related_name="supplier_created_by")
    last_updated_by = models.ForeignKey(
        StaffProfile, null=True, on_delete=models.SET_NULL, related_name="supplier_last_updated_by")
    recycle_bin = models.BooleanField(default=False)
    created_on = models.DateTimeField(auto_now_add=True)
    last_updated_on = models.DateTimeField(auto_now=True)

    # def save(self, *args, **kwargs):
    #     if not self.pk:
    #         numberReg = re.sub(
    #             r'[^0-9]', '', self.timestamp.strftime('%Y-%m-%d %H:%M:%S'))
    #         self.purchase_order_number = "SP"+numberReg
    #     super().save(*args, **kwargs)


class SupplierPaymentDetails(models.Model):
    supplier = models.ForeignKey(
        Supplier, null=True, on_delete=models.CASCADE, related_name="supplier_payment_details")
    banking_institution_name = models.CharField(
        max_length=100, default="", blank=True)
    bank_account_name = models.CharField(
        max_length=100, default="", blank=True)
    bank_account_number = models.CharField(
        max_length=100, default="", blank=True)
    # added banking details
    bank_branch_name = models.CharField(
        max_length=100, default="", blank=True)
    bank_branch_code = models.CharField(
        max_length=100, default="", blank=True)
    bank_swift_code = models.CharField(
        max_length=100, default="", blank=True)
    created_on = models.DateTimeField(auto_now_add=True)
    last_updated_on = models.DateTimeField(auto_now=True)
    

class SupplierDocument(models.Model):
    DOCUMENT_TYPES = [
        ('kyc_id', 'Identification'),
        ('kyc_certificate', 'Certificate'),
        ('tax_compliance', 'Tax Compliance'),
        ('contract', 'Contract'),
        ('other', 'Other'),
    ]
    supplier = models.ForeignKey(
        Supplier, null=True, on_delete=models.CASCADE, related_name='supplier_documents')
    document_name = models.CharField(max_length=200, default='')
    document_type = models.CharField(max_length=50, default='other')
    content_type = models.CharField(max_length=120, default='application/octet-stream')
    file_data_base64 = models.TextField(default='', blank=True)
    uploaded_by = models.ForeignKey(
        StaffProfile, null=True, on_delete=models.SET_NULL,
        related_name='supplier_documents_uploaded')
    recycle_bin = models.BooleanField(default=False)
    created_on = models.DateTimeField(auto_now_add=True)
    last_updated_on = models.DateTimeField(auto_now=True)


class PurchaseOrder(models.Model):
    purchase_order_number = models.CharField(
        max_length=50, unique=True, default="")
    company_profile = models.ForeignKey(
        CompanyProfile, null=True, on_delete=models.CASCADE, related_name="company_purchase_orders")
    purchase_value_overall = models.CharField(max_length=15, default="0.00",)
    purchase_order_landed_costs_overall = models.CharField(
        max_length=15, default="0.00",)
    purchase_order_approved = models.BooleanField(default=False) #approved by the head of finance
    created_by = models.ForeignKey(
        StaffProfile, null=True, on_delete=models.SET_NULL, related_name="purchase_order_created_by")
    last_updated_by = models.ForeignKey(
        StaffProfile, null=True, on_delete=models.SET_NULL, related_name="purchase_order_last_updated_by")
    purchase_order_approved_by = models.ForeignKey(
        StaffProfile, null=True, on_delete=models.SET_NULL, related_name="purchase_order_approved_by")
    recycle_bin = models.BooleanField(default=False)
    created_on = models.DateTimeField(auto_now_add=True)
    last_updated_on = models.DateTimeField(auto_now=True)
    timestamp = models.DateTimeField(default=timezone.now)
    
    class Meta:
        # ordering= ("first_name", "last_name",)
        verbose_name = "Purchase Order"
        verbose_name_plural = "Purchase Orders"

    def save(self, *args, **kwargs):
        if not self.pk:
            numberReg = re.sub(
                r'[^0-9]', '', self.timestamp.strftime('%Y-%m-%d %H:%M:%S'))
            self.purchase_order_number = "PO"+numberReg
        super().save(*args, **kwargs)

class ProductPurchaseInstance(models.Model):
    purchase_order = models.ForeignKey(
        PurchaseOrder, null=True, on_delete=models.CASCADE, related_name="purchase_order_product_instances")
    purchase_requisition_instance = models.ForeignKey(
        PurchaseRequisitionInstance, null=True, on_delete=models.SET_NULL,
        related_name="purchase_requisition_product_instances")
    purchase_product = models.ForeignKey(
        Product, null=True, on_delete=models.SET_NULL, related_name="purchase_product_instances")
    # purchase_product_name = models.CharField(max_length=100, default="",)
    supplier = models.ForeignKey(
        Supplier, null=True, on_delete=models.SET_NULL, related_name="supplier_product_purchase_instances")
    purchase_value_per_unit = models.CharField(max_length=15, default="0.00",)
    currency_choices = [("usd", "USD"), ("gbp", "GBP"), ("eur", "EUR"),
                                           ("kes", "KES"), ("not_selected", "Not Selected")]
    cost_currency = models.CharField(
        max_length=30, choices=currency_choices, default="kes")
    exchange_rate = models.CharField(
        max_length=12, blank=True, default="1.00")
    input_vat_amount = models.CharField(max_length=15, default="0.00", blank=True)
    purchase_value_overall = models.CharField(max_length=15, default="0.00",)
    purchase_amount_paid_to_supplier = models.CharField(max_length=15, default="0.00",)
    supplier_payment_settled = models.BooleanField(default=False)
    product_purchase_delivered = models.BooleanField(default=False)
    quantity_purchased = models.CharField(max_length=15, default="0",)
    quantity_delivered = models.CharField(max_length=15, default="0",)
    created_by = models.ForeignKey(
        StaffProfile, null=True, on_delete=models.SET_NULL, related_name="product_purchase_instance_created_by")
    last_updated_by = models.ForeignKey(
        StaffProfile, null=True, on_delete=models.SET_NULL, related_name="product_purchase_instance_last_updated_by")
    recycle_bin = models.BooleanField(default=False)
    created_on = models.DateTimeField(auto_now_add=True)
    last_updated_on = models.DateTimeField(auto_now=True)

    class Meta:
        # ordering= ("first_name", "last_name",)
        verbose_name = "Product Purchase Instance"
        verbose_name_plural = "Product Purchase Instances"


class StockOrder(models.Model): #only applicable to subsidiary procurement departments, the main procurement can just read and approve it
    company_branch = models.ForeignKey(
        CompanyBranch, null=True, on_delete=models.SET_NULL, related_name="branch_stock_orders")
    stock_order_number = models.CharField(max_length=50, unique=True,default="")
    stock_order_approved = models.BooleanField(default=False) #approved by head of procurement of the main branch
    created_by = models.ForeignKey(
        StaffProfile, null=True, on_delete=models.SET_NULL, related_name="stock_order_created_by")
    last_updated_by = models.ForeignKey(
        StaffProfile, null=True, on_delete=models.SET_NULL, related_name="stock_order_last_updated_by")
    stock_order_approved_by = models.ForeignKey(
        StaffProfile, null=True, on_delete=models.SET_NULL, related_name="stock_order_approved_by")
    recycle_bin = models.BooleanField(default=False)
    created_on = models.DateTimeField(auto_now_add=True)
    last_updated_on = models.DateTimeField(auto_now=True)

    class Meta:
        # ordering= ("first_name", "last_name",)
        verbose_name = "Stock Order"
        verbose_name_plural = "Stock Orders"

    def save(self, *args, **kwargs):
        if not self.pk:
            numberReg = re.sub(
                r'[^0-9]', '', self.timestamp.strftime('%Y-%m-%d %H:%M:%S'))
            self.stock_order_number = "SO"+numberReg
        super().save(*args, **kwargs)


# only applicable to subsidiary procurement departments
class StockOrderInstance(models.Model):
    stock_order = models.ForeignKey(
        PurchaseOrder, null=True, on_delete=models.SET_NULL, related_name="stock_order_product_instances")
    stock_requisition_instance = models.OneToOneField(
        StockRequisitionInstance, null=True, on_delete=models.SET_NULL, related_name="stock_requisition_product_instances")
    # supplier = models.ForeignKey(
    #     Supplier, null=True, on_delete=models.SET_NULL, related_name="supplier_product_purchase_instances")
    # purchase_value_per_unit = models.CharField(max_length=15, default="0.00",)
    # purchase_value_overall = models.CharField(max_length=15, default="0.00",)
    # purchase_amount_paid_to_supplier = models.CharField(
    #     max_length=15, default="0.00",)
    # supplier_payment_settled = models.BooleanField(default=False)
    stock_order_item_delivered = models.BooleanField(default=False)
    quantity_ordered = models.CharField(max_length=15, default="0",)
    quantity_delivered = models.CharField(max_length=15, default="0",)
    created_by = models.ForeignKey(
        StaffProfile, null=True, on_delete=models.SET_NULL, related_name="stock_order_instance_created_by")
    last_updated_by = models.ForeignKey(
        StaffProfile, null=True, on_delete=models.SET_NULL, related_name="stock_order_instance_last_updated_by")
    recycle_bin = models.BooleanField(default=False)
    created_on = models.DateTimeField(auto_now_add=True)
    last_updated_on = models.DateTimeField(auto_now=True)

    class Meta:
        # ordering= ("first_name", "last_name",)
        verbose_name = "Stock Order Instance"
        verbose_name_plural = "Stock Order Instances"

    
    
