# forms.py

from django import forms
from django.utils import timezone
from inventory import models
from inventory.models import (
    SaleOrder,
    ConsumerReturn,
    ConsumerReturnItem,
    Order,
    Payment_From_Consumer,
    Payment_To_Supplier,
    OrderItem,
    Product,
    Collection,
    SaleOrderItems,
    Consumer,
    ConsumerAccount,
    SupplierAccount,
    Doctor,
    DoctorProductCommission,
    ConsumerProductDiscount,
)
from finance.models import AddExpense

class ConsumerReturnForm(forms.ModelForm):
    class Meta:
        model = ConsumerReturn
        fields = ['saleorder', 'remarks']
        widgets = {
            'saleorder': forms.Select(attrs={'class': 'form-select'}),
            'remarks': forms.Textarea(attrs={'class': 'form-control', 'rows': 2}),
        }


class ConsumerReturnItemForm(forms.ModelForm):
    class Meta:
        model = ConsumerReturnItem
        fields = ['saleorder_item', 'quantity']
        widgets = {
            'saleorder_item': forms.Select(attrs={'class': 'form-select'}),
            'quantity': forms.NumberInput(attrs={'class': 'form-control'}),
        }
class AddExpenseForm(forms.ModelForm):
    class Meta:
        model = AddExpense
        fields = ['expense_category', 'spent_by', 'approved_by', 'amount',
                  'currency', 'from_account', 'description', 'remarks', 'date']
        widgets = {
            'expense_category': forms.Select(attrs={'class': 'form-select'}),
            'spent_by': forms.TextInput(attrs={'class': 'form-select'}),
            'approved_by': forms.Select(attrs={'class': 'form-select'}),
            'amount': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01'}),
            'currency': forms.Select(attrs={'class': 'form-select'}),
            'from_account': forms.Select(attrs={'class': 'form-select'}),
            'description': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}),
            'remarks': forms.Textarea(attrs={'class': 'form-control', 'rows': 2}),
            'date': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
        }


class CollectionForm(forms.ModelForm):
    class Meta:
        model = Collection
        fields = ['title', 'featured_product']
        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control'}),
            'featured_product': forms.Select(attrs={'class': 'form-select'}),
        }


class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = [
            'title', 'slug', 'abbreviation', 'description',
            'unit_price', 'commission', 'currency', 'inventory',
            'collection', 'packing_style', 'measurement_unit', 'discount_limit'
        ]
        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control'}),
            'slug': forms.TextInput(attrs={'class': 'form-control'}),
            'abbreviation': forms.TextInput(attrs={'class': 'form-control'}),
            'description': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}),
            'unit_price': forms.NumberInput(attrs={'class': 'form-control'}),
            'commission': forms.NumberInput(attrs={'class': 'form-control'}),
            'currency': forms.Select(attrs={'class': 'form-select'}),
            'inventory': forms.NumberInput(attrs={'class': 'form-control'}),
            'collection': forms.Select(attrs={'class': 'form-select'}),
            'packing_style': forms.Select(attrs={'class': 'form-select'}),
            'measurement_unit': forms.Select(attrs={'class': 'form-select'}),
            'discount_limit': forms.NumberInput(attrs={'class': 'form-control'}),
        }


class DoctorForm(forms.ModelForm):
    class Meta:
        model = Doctor
        fields = ['name', 'contact']
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'contact': forms.TextInput(attrs={'class': 'form-control'}),
        }


class BalanceOpeningForm(forms.ModelForm):
    class Meta:
        model = ConsumerAccount
        fields = ['details', 'credit']
        widgets = {
            'details': forms.TextInput(attrs={'class': 'form-control'}),
            'credit': forms.NumberInput(attrs={'class': 'form-control'}),
        }


class ConsumerForm(forms.ModelForm):
    class Meta:
        model = Consumer
        fields = [
            'name',
            'business_nature',
            'in_charge',
            'phone_number',
            'email',
            'website',
            'account_number',
            'address',
        ]
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'business_nature': forms.TextInput(attrs={'class': 'form-control'}),
            'in_charge': forms.TextInput(attrs={'class': 'form-control'}),
            'phone_number': forms.TextInput(attrs={'class': 'form-control'}),
            'email': forms.EmailInput(attrs={'class': 'form-control'}),
            'website': forms.URLInput(attrs={'class': 'form-control'}),
            'account_number': forms.TextInput(attrs={'class': 'form-control'}),
            'address': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}),
        }


class SaleOrderForm(forms.ModelForm):
    class Meta:
        model = SaleOrder
        fields = ['consumer', 'payment_status', 'visited_by', 'brt_rate', 'remarks']
        widgets = {
            'consumer': forms.Select(attrs={'class': 'form-select'}),
            'payment_status': forms.Select(attrs={'class': 'form-select'}),
            'visited_by': forms.Select(attrs={'class': 'form-select'}),
            'brt_rate': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01'}),
            'remarks': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}),
        }


class SaleOrderItemsForm(forms.ModelForm):
    class Meta:
        model = SaleOrderItems
        fields = ['product', 'quantity', 'price', 'doctor',
                  'discount', 'commission', 'net_price']
        widgets = {
            'product': forms.Select(attrs={'class': 'form-select'}),
            'quantity': forms.NumberInput(attrs={'class': 'form-control'}),
            'price': forms.NumberInput(attrs={'class': 'form-control'}),
            'doctor': forms.Select(attrs={'class': 'form-select'}),
            'discount': forms.NumberInput(attrs={'class': 'form-control'}),
            'commission': forms.NumberInput(attrs={'class': 'form-control'}),
            'net_price': forms.NumberInput(attrs={'class': 'form-control'}),
        }


class OrderForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = [
            'order_by', 'order_to', 'due_date', 'cargo', 'other_charges',
            'holder', 'total_amount', 'currency', 'exchange_rate',
            'amount_paid', 'amount_remain', 'order_status', 'remarks'
        ]
        widgets = {
            'order_by': forms.TextInput(attrs={'class': 'form-control'}),
            'order_to': forms.Select(attrs={'class': 'form-select'}),
            'due_date': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
            'cargo': forms.TextInput(attrs={'class': 'form-control'}),
            'other_charges': forms.NumberInput(attrs={'class': 'form-control'}),
            'holder': forms.Select(attrs={'class': 'form-select'}),
            'total_amount': forms.NumberInput(attrs={'class': 'form-control'}),
            'currency': forms.Select(attrs={'class': 'form-select'}),
            'exchange_rate': forms.NumberInput(attrs={'class': 'form-control'}),
            'amount_paid': forms.NumberInput(attrs={'class': 'form-control'}),
            'amount_remain': forms.NumberInput(attrs={'class': 'form-control'}),
            'order_status': forms.Select(attrs={'class': 'form-select'}),
            'remarks': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}),
        }


class OrderItemForm(forms.ModelForm):
    class Meta:
        model = OrderItem
        fields = ['product', 'quantity',
                  'unit_price']
        widgets = {
            'product': forms.Select(attrs={'class': 'form-select'}),
            'quantity': forms.NumberInput(attrs={'class': 'form-control'}),
            'unit_price': forms.NumberInput(attrs={'class': 'form-control'}),
        }


class PaymentFromConsumerForm(forms.ModelForm):
    created_at = forms.DateTimeField(
        required=True,
        widget=forms.DateTimeInput(
            attrs={'class': 'form-control', 'type': 'datetime-local'}
        ),
        input_formats=['%Y-%m-%dT%H:%M'],
    )

    class Meta:
        model = Payment_From_Consumer
        fields = ['created_at', 'received_by', 'received_in', 'amount_paid', 'receipt_no', 'remarks']
        widgets = {
            'received_by': forms.Select(attrs={'class': 'form-select'}),
            'received_in': forms.Select(attrs={'class': 'form-select'}),
            'amount_paid': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01'}),
            'receipt_no': forms.TextInput(attrs={'class': 'form-control'}),
            'remarks': forms.Textarea(attrs={'class': 'form-control', 'rows': 2}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if not self.is_bound:
            current_time = timezone.now()
            if timezone.is_aware(current_time):
                current_time = timezone.localtime(current_time)
            self.initial.setdefault(
                'created_at',
                current_time.strftime('%Y-%m-%dT%H:%M')
            )


class PaymentToSupplierForm(forms.ModelForm):
    class Meta:
        model = Payment_To_Supplier
        fields = ['paid_by', 'paid_from', 'amount_paid', 'receipt_no', 'remarks']
        widgets = {
            'paid_by': forms.Select(attrs={'class': 'form-select'}),
            'paid_from': forms.Select(attrs={'class': 'form-select'}),
            'amount_paid': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01'}),
            'receipt_no': forms.TextInput(attrs={'class': 'form-control'}),
            'remarks': forms.Textarea(attrs={'class': 'form-control', 'rows': 2}),
        }

class DoctorProductCommissionForm(forms.ModelForm):
    class Meta:
        model = models.DoctorProductCommission
        fields = ["doctor", "product", "commission"]
        widgets = {
            "doctor": forms.Select(attrs={"class": "form-select"}),
            "product": forms.Select(attrs={"class": "form-select"}),
            "commission": forms.NumberInput(attrs={"class": "form-control", "step": "0.01"}),
        }


class ConsumerProductDiscountForm(forms.ModelForm):
    class Meta:
        model = models.ConsumerProductDiscount
        fields = ["consumer", "product", "discount", "unit_price"]
        widgets = {
            "consumer": forms.Select(attrs={"class": "form-select"}),
            "product": forms.Select(attrs={"class": "form-select"}),
            "discount": forms.NumberInput(attrs={"class": "form-control"}),
            "unit_price": forms.NumberInput(attrs={"class": "form-control", "step": "0.01"}),
        }


class SupplierForm(forms.ModelForm):
    class Meta:
        model = models.Supplier
        fields = [
            "name",
            "country",
            "owner",
            "contacted_person",
            "email_address",
            "phone_number",
            "bank_account_number",
            "remarks",
        ]
        widgets = {
            "name": forms.TextInput(attrs={"class": "form-control"}),
            "country": forms.TextInput(attrs={"class": "form-control"}),
            "owner": forms.TextInput(attrs={"class": "form-control"}),
            "contacted_person": forms.TextInput(attrs={"class": "form-control"}),
            "email_address": forms.EmailInput(attrs={"class": "form-control"}),
            "phone_number": forms.TextInput(attrs={"class": "form-control"}),
            "bank_account_number": forms.TextInput(attrs={"class": "form-control"}),
            "remarks": forms.Textarea(attrs={"class": "form-control", "rows": 3}),
        }
