from django.urls import path
from django.contrib.auth.views import LoginView, LogoutView
from . import views
from .models import (
    SaleOrder,
    ConsumerProductDiscount,
    DoctorProductCommission,
    Consumer,
    Doctor,
    Order,
    Collection,
    Product,
    Supplier,
)
from django.contrib.auth.decorators import login_required
from inventory.views import (
    generic_list_view,
    generic_delete_view,
    bulk_delete_view,
    generic_form_view,
    saleorder_list_view,
    doctor_define_commission_view,
    consumer_define_discount_view,
)
from django.shortcuts import get_object_or_404
from django.urls import reverse_lazy, reverse
from .forms import (
    ConsumerForm,
    DoctorForm,
    CollectionForm,
    ProductForm,
    AddExpenseForm,
    DoctorProductCommissionForm,
    ConsumerProductDiscountForm,
    SupplierForm,
)
from finance.models import AddExpense
app_name = 'inventory'
urlpatterns = [
    # delete expense url
    path('expenses/delete/<int:pk>/', lambda request, pk: generic_delete_view(
        request,
        model=AddExpense,
        pk=pk,
        success_url=reverse_lazy('inventory:expense_list'),
        template_name='admin_pages/confirm_delete.html',
        context_name='expense',
        permission='finance.delete_addexpense'
    ), name='expense_delete'),
    path('expenses/<int:pk>/print/',
         views.expense_print_view, name='expense_print'),

    # edit expense url
    path('expenses/edit/<int:pk>/', lambda request, pk: generic_form_view(
        request,
        model=AddExpense,
        form_class=AddExpenseForm,
        template_name='admin_pages/expense_form.html',
        success_url=reverse_lazy('inventory:expense_list'),
        title='Edit Expense',
        object_instance=get_object_or_404(AddExpense, pk=pk),
        permission='finance.change_addexpense'
    ), name='expense_edit'),
    # add expese url
    path('expenses/add/', lambda request: generic_form_view(
        request,
        model=AddExpense,
        form_class=AddExpenseForm,
        template_name='admin_pages/expense_form.html',
        success_url=reverse_lazy('inventory:expense_list'),
        title='Add Expense',
        permission='finance.add_addexpense'
    ), name='expense_add'),
    # expense list
    path(
        'expenses/',
        lambda request: generic_list_view(
            request,
            model=AddExpense,
            template_name='admin_pages/expense_list.html',
            context_name='expenses',
            search_fields=['spent_by', 'description',
                           'remarks'],  # corrected fields
            permission='finance.view_addexpense'
        ),
        name='expense_list'
    ),
    path("cash-collections/", views.cash_collection_list_view, name="cash_collection_list"),
    # product List
    path('orders/', lambda request: generic_list_view(
        request,
        model=Order,
        template_name='admin_pages/orders_list.html',
        context_name='orders',
        search_fields=['order_by'],
        items_per_page=100000,  # 👈 show all
        permission='inventory.view_order'  # adjust if your app name is different
    ), name='order_list'),
    # product edit
    path('products/<int:pk>/edit/', lambda request, pk: generic_form_view(
        request=request,
        model=Product,
        form_class=ProductForm,
        template_name='admin_pages/product_form.html',
        object_instance=get_object_or_404(Product, pk=pk),
        success_url=reverse_lazy('inventory:product_list'),
        title='Edit Product',
        permission='inventory.change_product'
    ), name='product_edit'),
    # product delete
    path('products/delete/<int:pk>/', lambda request, pk: generic_delete_view(
        request,
        model=Product,
        pk=pk,
        success_url=reverse_lazy('inventory:product_list'),
        template_name='admin_pages/confirm_delete.html',
        object_name_field='title',
        context_name='product'
    ), name='product_delete'),
    # product add
    path('products/create/', lambda request: generic_form_view(
        request=request,
        model=Product,
        form_class=ProductForm,
        template_name='admin_pages/product_form.html',
        success_url=reverse_lazy('inventory:product_list'),
        title='Add New Product',
        permission='inventory.add_product'
    ), name='product_create'),

    # product List
    path('products/', lambda request: generic_list_view(
        request,
        model=Product,
        template_name='admin_pages/product_list.html',
        context_name='products',
        search_fields=['title'],
        items_per_page=100000,  # 👈 show all
        permission='inventory.view_product'  # adjust if your app name is different
    ), name='product_list'),
    # collection delete
    path('collections/delete/<int:pk>/', lambda request, pk: generic_delete_view(
        request,
        model=Collection,
        pk=pk,
        success_url=reverse_lazy('inventory:collection_list'),
        template_name='admin_pages/confirm_delete.html',
        object_name_field='title',
        context_name='collection'
    ), name='collection_delete'),
    # collection edit
    path('collections/<int:pk>/edit/', lambda request, pk: generic_form_view(
        request=request,
        model=Collection,
        form_class=CollectionForm,
        template_name='admin_pages/collection_form.html',
        success_url=reverse_lazy('inventory:collection_list'),
        title='Edit Collection',
        object_instance=get_object_or_404(Collection, pk=pk),
    ), name='collection_edit'),

    # Collection add
    path('collections/add/', lambda request: generic_form_view(
        request,
        model=Collection,
        form_class=CollectionForm,
        template_name='admin_pages/collection_form.html',
        success_url=reverse_lazy('inventory:collection_list'),
        title='Add Collection',
    ), name='collection_add'),
    # Collection List
    path('collections/', lambda request: generic_list_view(
        request,
        model=Collection,
        template_name='admin_pages/collection_list.html',
        context_name='collections',
        search_fields=['title'],
        items_per_page=100000,  # 👈 show all
        permission='inventory.view_collection'  # adjust if your app name is different
    ), name='collection_list'),
    path('doctor/<int:doctor_id>/commissions/',
         views.doctor_commission_list_view, name='doctor_commission_list'),
    path('doctor/<int:doctor_id>/define-commission/',
         views.doctor_define_commission_view, name='doctor_define_commission'),
    path('doctors/edit/<int:pk>/', lambda request, pk: generic_form_view(
        request,
        model=Doctor,
        form_class=DoctorForm,
        template_name='admin_pages/doctor_form.html',
        success_url=reverse_lazy('inventory:doctor_list'),
        title='Edit Doctor',
        object_instance=Doctor.objects.get(pk=pk)
    ), name='doctor_edit'),

    path('doctors/delete/<int:pk>/', lambda request, pk: generic_delete_view(
        request,
        model=Doctor,
        pk=pk,
        success_url=reverse_lazy('inventory:doctor_list'),
        template_name='admin_pages/confirm_delete.html',
        object_name_field='name',
        context_name='doctor'
    ), name='doctor_delete'),

    path('doctors/add/', lambda request: generic_form_view(
        request,
        model=Doctor,
        form_class=DoctorForm,
        template_name='admin_pages/doctor_form.html',
        success_url=reverse_lazy('inventory:doctor_list'),
        title='Add Doctor',
    ), name='doctor_add'),

    path('doctors/', lambda request: generic_list_view(
        request,
        model=Doctor,
        template_name='admin_pages/doctor_list.html',
        context_name='doctors',
        search_fields=['name', 'contact'],
        permission='inventory.view_doctor'  # adjust if your app name is different
    ), name='doctor_list'),

    # Doctor Product Commission CRUD
    path('doctor-product-commissions/', lambda request: generic_list_view(
        request,
        model=DoctorProductCommission,
        template_name='admin_pages/doctor_product_commission_list.html',
        context_name='commissions',
        search_fields=['doctor__name', 'product__title'],
        items_per_page=100000,
        permission='inventory.view_doctorproductcommission'
    ), name='doctor_product_commission_list'),
    path('doctor-product-commissions/add/', lambda request: generic_form_view(
        request,
        model=DoctorProductCommission,
        form_class=DoctorProductCommissionForm,
        template_name='admin_pages/doctor_product_commission_form.html',
        success_url=reverse_lazy('inventory:doctor_product_commission_list'),
        title='Add Doctor Commission'
    ), name='doctor_product_commission_add'),
    path('doctor-product-commissions/<int:pk>/edit/', lambda request, pk: generic_form_view(
        request,
        model=DoctorProductCommission,
        form_class=DoctorProductCommissionForm,
        template_name='admin_pages/doctor_product_commission_form.html',
        success_url=reverse_lazy('inventory:doctor_product_commission_list'),
        title='Edit Doctor Commission',
        object_instance=get_object_or_404(DoctorProductCommission, pk=pk)
    ), name='doctor_product_commission_edit'),
    path('doctor-product-commissions/delete/<int:pk>/', lambda request, pk: generic_delete_view(
        request,
        model=DoctorProductCommission,
        pk=pk,
        success_url=reverse_lazy('inventory:doctor_product_commission_list'),
        template_name='admin_pages/confirm_delete.html',
        context_name='commission'
    ), name='doctor_product_commission_delete'),

    # Consumer Product Discount CRUD
    path('consumer-product-discounts/', lambda request: generic_list_view(
        request,
        model=ConsumerProductDiscount,
        template_name='admin_pages/consumer_product_discount_list.html',
        context_name='discounts',
        search_fields=['consumer__name', 'product__title'],
        items_per_page=100000,
        permission='inventory.view_consumerproductdiscount'
    ), name='consumer_product_discount_list'),
    path('consumer-product-discounts/add/', lambda request: generic_form_view(
        request,
        model=ConsumerProductDiscount,
        form_class=ConsumerProductDiscountForm,
        template_name='admin_pages/consumer_product_discount_form.html',
        success_url=reverse_lazy('inventory:consumer_product_discount_list'),
        title='Add Consumer Discount'
    ), name='consumer_product_discount_add'),
    path('consumer-product-discounts/<int:pk>/edit/', lambda request, pk: generic_form_view(
        request,
        model=ConsumerProductDiscount,
        form_class=ConsumerProductDiscountForm,
        template_name='admin_pages/consumer_product_discount_form.html',
        success_url=reverse_lazy('inventory:consumer_product_discount_list'),
        title='Edit Consumer Discount',
        object_instance=get_object_or_404(ConsumerProductDiscount, pk=pk)
    ), name='consumer_product_discount_edit'),
    path('consumer-product-discounts/delete/<int:pk>/', lambda request, pk: generic_delete_view(
        request,
        model=ConsumerProductDiscount,
        pk=pk,
        success_url=reverse_lazy('inventory:consumer_product_discount_list'),
        template_name='admin_pages/confirm_delete.html',
        context_name='discount'
    ), name='consumer_product_discount_delete'),

    path('consumer/<int:consumer_id>/opening-balance/',
         views.supplier_balance_opening_view, name='supplier_balance_opening'),
    path('consumer/<int:consumer_id>/define-discount/',
         views.consumer_define_discount_view, name='consumer_define_discount'),
    # consumer account list
    path(
        'consumers/<int:consumer_id>/accounts/',
        views.consumer_account_list_view,
        name='consumer_account_list'
    ),
    path('payment/slip/<int:account_id>/',
         views.consumer_payment_slip_view, name='consumer_payment_slip'),
    # Consumer list
    path(
        'consumers/',
        lambda request: generic_list_view(
            request,
            model=Consumer,
            template_name='admin_pages/consumer_list.html',
            context_name='consumers',               # only generic_list_view accepts this
            search_fields=['name', 'business_nature',
                           'in_charge', 'phone_number'],
            items_per_page=100000,  # Show all consumers
            permission='inventory.view_consumer'
        ),
        name='consumer_list'
    ),
    # Add Consumer
    path(
        'consumers/add/',
        lambda request: generic_form_view(
            request,
            model=Consumer,
            form_class=ConsumerForm,
            template_name='admin_pages/consumer_form.html',
            success_url=reverse_lazy('inventory:consumer_list'),
            title='Add Consumer'
        ),
        name='consumer_create'
    ),

    # Edit Consumer
    path(
        'consumers/edit/<int:pk>/',
        lambda request, pk: generic_form_view(
            request,
            model=Consumer,
            form_class=ConsumerForm,
            template_name='admin_pages/consumer_form.html',
            success_url=reverse_lazy('inventory:consumer_list'),
            title='Edit Consumer',
            permission='inventory.change_consumer',
            object_instance=get_object_or_404(Consumer, pk=pk)
        ),
        name='consumer_edit'
    ),
    path(
        'consumers/delete/<int:pk>/',
        lambda request, pk: generic_delete_view(
            request,
            model=Consumer,
            pk=pk,
            success_url=reverse_lazy('inventory:consumer_list'),
            template_name='admin_pages/confirm_delete.html',
            object_name_field='name',
            permission='inventory.delete_consumer',
            context_name='consumer'
        ),
        name='consumer_delete'
    ),
    # Supplier CRUD
    path('suppliers/', lambda request: generic_list_view(
        request,
        model=Supplier,
        template_name='admin_pages/supplier_list.html',
        context_name='suppliers',
        search_fields=['name', 'country', 'owner', 'contacted_person'],
        items_per_page=100000,
        permission='inventory.view_supplier'
    ), name='supplier_list'),
    path('suppliers/add/', lambda request: generic_form_view(
        request,
        model=Supplier,
        form_class=SupplierForm,
        template_name='admin_pages/supplier_form.html',
        success_url=reverse_lazy('inventory:supplier_list'),
        title='Add Supplier'
    ), name='supplier_add'),
    path('suppliers/edit/<int:pk>/', lambda request, pk: generic_form_view(
        request,
        model=Supplier,
        form_class=SupplierForm,
        template_name='admin_pages/supplier_form.html',
        success_url=reverse_lazy('inventory:supplier_list'),
        title='Edit Supplier',
        permission='inventory.change_supplier',
        object_instance=get_object_or_404(Supplier, pk=pk)
    ), name='supplier_edit'),
    path('suppliers/delete/<int:pk>/', lambda request, pk: generic_delete_view(
        request,
        model=Supplier,
        pk=pk,
        success_url=reverse_lazy('inventory:supplier_list'),
        template_name='admin_pages/confirm_delete.html',
        object_name_field='name',
        context_name='supplier',
        permission='inventory.delete_supplier'
    ), name='supplier_delete'),
    path('suppliers/<int:supplier_id>/accounts/',
         views.supplier_account_list_view, name='supplier_account_list'),
    path('supplier/payment/slip/<int:account_id>/',
         views.supplier_payment_slip_view, name='supplier_payment_slip'),
    path('supplier/<int:supplier_id>/add-payment/',
         views.supplier_payment_create_view, name='supplier_payment_add'),
    path('consumer/<int:consumer_id>/add-payment/',
         views.consumer_payment_create_view, name='consumer_payment_add'),
    # API endpoint for AJAX product search
    path('api/order-product-search/', views.order_product_search_api,
         name='order_product_search_api'),
    # Order create and update
    path('orders/add/', views.order_create_or_update_view, name='order_create'),
    path('orders/<int:pk>/edit/',
         views.order_create_or_update_view, name='order_update'),
    path('orders/delete/<int:pk>/', lambda request, pk: generic_delete_view(
        request,
        model=Order,
        pk=pk,
        success_url=reverse_lazy('inventory:order_list'),
        template_name='admin_pages/confirm_delete.html',
        object_name_field='order_by',  # Will call `str(order_by)` as the label
        context_name='order'
    ), name='order_delete'),
    path('orders/<int:order_id>/receive/',
         views.order_receive_view, name='order_receive'),
    path('orders/<int:order_id>/receive/details/',
         views.order_receive_details_view, name='order_receive_details'),
    path('orders/<int:order_id>/return/',
         views.order_return_view, name='order_return'),
    path('saleorders/add/', views.saleorder_create_or_update_view,
         name='saleorder_create'),
    path('saleorders/edit/<int:pk>/',
         views.saleorder_create_or_update_view, name='saleorder_edit'),
    path('saleorders/<int:saleorder_id>/return/',
         views.consumer_return_create_view, name='consumer_return_create'),
    path('api/product-search/', views.product_search_api,
         name='product_search_api'),
    path('api/consumer-discount-map/', views.consumer_discount_map_api,
         name='consumer_discount_map_api'),
    path('api/doctor-commission-map/', views.doctor_commission_map_api,
         name='doctor_commission_map_api'),
    path('saleorders/delete/<int:pk>/', lambda request, pk: generic_delete_view(
        request,
        model=SaleOrder,
        pk=pk,
        success_url=reverse_lazy('inventory:saleorder_list'),
        template_name='admin_pages/confirm_delete.html',
        object_name_field='consumer',  # Will call `str(consumer)` as the label
        context_name='saleorder'
    ), name='saleorder_delete'),
    path('saleorder/bulk-delete/', lambda request: bulk_delete_view(
        request,
        model=SaleOrder,
        template_name='admin_pages/confirm_bulk_delete.html',
        success_url=reverse_lazy('inventory:saleorder_list'),
        object_name_field='track_number'
    ), name='saleorder_bulk_delete'),
    path('saleorders/', views.saleorder_list_view, name='saleorder_list'),
    path("", views.admin_page, name="admin_page"),
    path('inventory/order/details/print/<int:pk>/',
         views.order_details, name='order_print'),
    path('inventory/received/order/details/print/<int:pk>/',
         views.received_order_details, name='received_order_details'),

    path('inventory/sales/bill/print/<int:pk>/',
         views.generate_invoice, name='print_sale_bill'),
    path('inventory/consumer/balance/print/<int:pk>/',
         views.print_consumer_balance_sheet, name='print_consumer_balance'),
    path('inventory/doctor/balance/print/<int:pk>/',
         views.print_doctor_balance_sheet, name='print_doctor_balance'),
    path('inventory/consumer/outstanding/details/print/',
         views.consumer_outstanding_details, name='consumer_outstanding_details'),
    path('inventory/doctor/commission/details/print/',
         views.commission_details, name='doctor_commission_details'),
    path('inventory/consumer/payment/voucher/print/<int:pk>/',
         views.received_payment_voucher_from_consumer, name='print_consumer_payment_voucher'),
    path('inventory/stock/with/purchased/rate/report/',
         views.stock_report_with_purchased_rate, name='stock_with_purchased_rate'),
    path('inventory/stock/with/sale/rate/report/',
         views.stock_report_with_sale_rate, name='stock_with_sale_rate'),
    path('inventory/product/received-order-report/', views.received_order_information,
         name='received_order_report'),
    path('inventory/product/sale-report/',
         views.sale_report, name='sale-report'),
    path('inventory/sales-report/', views.SalesReport, name='sales_report'),
    path('inventory/owner/share-holder/<int:pk>/',
         views.share_holder_details, name='share_holder_details'),
    path('reports/consumer-account/', views.consumer_account_summary_report, name='client_cash_report'),
]
