from datetime import datetime

from django.db import models
from django import forms
from django.forms import BaseModelFormSet, IntegerField, BaseFormSet, modelformset_factory

from . import bd
from .bd import divisions_choices, Dhaka, districts_choices, area_choices, Jigatola

package1 = "2MB"
package2 = "4MB"
package3 = "6MB"
package4 = "8MB"
package5 = "10MB"
package6 = "15MB"
package7 = "20MB"
package8 = "25MB"

package_choices = {
    package1: "2MB",
    package2: "4MB",
    package3: "6MB",
    package4: "8MB",
    package5: "10MB",
    package6: "15MB",
    package7: "20MB",
    package8: "25MB",

}

package_choices= [(k,v) for (k,v) in package_choices.items()]

month_dict = {'Janauary': 'Janauary',
         'February': 'February',
         'March': 'March',
         'April': 'April',
         'May': 'May',
         'June': 'June',
         'July': 'July',
         'August': 'August',
         'September': 'September',
         'October': 'October',
         'November': 'November',
         'December': 'December'

         }

month_tuples=		(('Janauary', 'Janauary'),
        ( 'February', 'February'),
        ( 'March', 'March'),
         ('April', 'April'),
         ('May', 'May'),
         ('June', 'June'),
         ('July', 'July'),
         ('August', 'August'),
         ('September', 'September'),
         ('October', 'October'),
         ('November', 'November'),
         ('December', 'December'))



# Create your models here.
class Customer(models.Model):
    id = models.AutoField(primary_key=True)
    # id = models.IntegerField(primary_key=True, default=int(datetime.now().timestamp()))
    # first_name = models.CharField(max_length=200)
    # last_name = models.CharField(max_length=200)
    full_name = models.CharField(max_length=200)
    mobile = models.CharField(max_length=15, default="01700000000")
    package = models.CharField(max_length=200, choices=package_choices, default=package1)
    nid = models.CharField(max_length=200, default="555566")
    #    ip = models.CharField(max_length=200, default="0.0.0.0")
    dial_up_username = models.CharField(max_length=200, default="sr@username")
    state = models.CharField(max_length=20, choices=divisions_choices, default=Dhaka)
    city = models.CharField(max_length=20, choices=districts_choices, default=Dhaka)
    area = models.CharField(max_length=30, choices=area_choices, default=Jigatola)
    address = models.CharField(max_length=200)
    billed_month = models.CharField(max_length=200, choices=month_tuples, null=True)

    # street2 = models.CharField(max_length=200, null=True)

    def __str__(self):
        return str(
            self.id) + " -- " + self.full_name + " -- " + self.area + " -- " + self.address


class Bill(models.Model):
    bill_created = models.DateTimeField(auto_now=True)
    bill_id = models.IntegerField(primary_key=True, default=int(datetime.now().timestamp()))
    month_bill = models.CharField(max_length=200, choices=month_tuples, default=month_dict["Janauary"])
    customer = models.ForeignKey("Customer", null=True, blank=True, on_delete=models.SET_NULL)
    # customer_name = models.CharField(max_length=200)
    package = models.CharField(max_length=200, choices=package_choices, default=package1)
    bill_amount = models.IntegerField()

    def __str__(self):
        return str(self.bill_id) + " Customer " + str(self.customer_id) + " package :" + str(
            self.package_id) + " amount :" + str(self.bill_amount)


class Inventory(models.Model):
    product_id = models.IntegerField(primary_key=True, default=int(datetime.now().timestamp()))
    item_name = models.CharField(max_length=200)
    item_updated = models.DateTimeField(auto_now=True)
    quantity = models.IntegerField()
    amount = models.IntegerField()

    def __str__(self):
        return str(self.product_id) + " -- " + self.item_name + " -- " + str(self.amount) + " -- " + str(self.quantity)


class SupportCases(models.Model):
    case_id = models.IntegerField(primary_key=True, default=int(datetime.now().timestamp()))
    customer = models.ForeignKey("Customer", null=True, blank=True, on_delete=models.SET_NULL)
    assigned_staff = models.CharField(max_length=200)
    description = models.TextField()
    resolution_provided = models.CharField(max_length=5, choices=(('YES', 'YES'),( 'NO', 'NO')), default='NO')

    def __str__(self):
        return str(self.case_id) + " -- " + str(
            self.customer_id) + " -- " + self.assigned_staff + " -- " + self.description


# class VisiblePrimaryKeyFormset(BaseModelFormSet):
#     def add_fields(self, form, index):
#         self._pk_field = pk = self.model._meta.pk
#         if form.is_bound:
#             pk_value = form.instance.pk
#         else:
#             try:
#                 pk_value = self.get_queryset()[index].pk
#             except IndexError:
#                 pk_value = None
#         form.fields[self._pk_field.name] = IntegerField(initial=pk_value,
#                                                         required=True)  # or any other field you would like to display the pk in
#         BaseFormSet.add_fields(self, form, index)  # call baseformset which does not modify your primary key field


class CustomerForm(forms.ModelForm):

    # def __init__(self, *args, **kwargs):
    #     super().__init__(*args, **kwargs)
    #     for field in self.fields.values():
    #         field.widget.attrs['class'] = 'form-control'

    class Meta:
        model = Customer
        # fields = ['id', 'first_name', 'last_name', 'package', 'nid', 'ip', 'dial_up_username', 'state', 'city', 'area',
        #           'street1', 'street2']
        fields = '__all__'


# LocFormSet = modelformset_factory(Customer,formset=VisiblePrimaryKeyFormset)

class BillForm(forms.ModelForm):

    # def __init__(self, *args, **kwargs):
    #     super().__init__(*args, **kwargs)
    #     for field in self.fields.values():
    #         field.widget.attrs['class'] = 'form-control'

    class Meta:
        model = Bill
        fields = '__all__'


class InventoryForm(forms.ModelForm):

    # def __init__(self, *args, **kwargs):
    #     super().__init__(*args, **kwargs)
    #     for field in self.fields.values():
    #         field.widget.attrs['class'] = 'form-control'

    class Meta:
        model = Inventory
        fields = '__all__'


class SupportCasesForm(forms.ModelForm):

    # def __init__(self, *args, **kwargs):
    #     super().__init__(*args, **kwargs)
    #     for field in self.fields.values():
    #         field.widget.attrs['class'] = 'form-control'

    class Meta:
        model = SupportCases
        fields = '__all__'
