from django.urls import path
from django.contrib.auth import views as auth_views
from .models import Category, Product, Order, OrderItem
from .views import generic_delete_view
from .views import (generic_form_view, bulk_delete_view,
                    export_to_pdf_view, bulk_status_update_view,
                    export_to_excel_view, generic_list_view)
from . import views
from django.shortcuts import get_object_or_404
from cargo.models import ExpenseCategory, AddExpense, Item, Invoice
from django.urls import reverse_lazy, reverse
from .forms import CategoryForm, ProductForm, ItemForm, InvoiceForm, ExpenseCategoryForm, AddExpenseForm
urlpatterns = [
    # urls for Invoice:
    # ✅ List View
    path('invoices/', lambda request: generic_list_view(
        request,
        model=Invoice,
        template_name='admin_pages/invoice_list.html',
        context_name='invoices',
        search_fields=['track_number', 'sender__name', 'receiver__name'],
        permission='cargo.view_invoice'
    ), name='invoice_list'),
    path('api/item-search/', views.item_search_api, name='item_search_api'),
    path('invoices/add/', views.invoice_create_or_update_view, name='invoice_create'),
    path('invoices/edit/<int:pk>/',
         views.invoice_create_or_update_view, name='invoice_edit'),
    path('api/sender/create/', views.create_sender_api, name='create_sender_api'),
    path('api/receiver/create/', views.create_receiver_api,
         name='create_receiver_api'),
    # ✅ Delete View
    path('invoices/delete/<int:pk>/', lambda request, pk: generic_delete_view(
        request,
        model=Invoice,
        pk=pk,
        success_url=reverse_lazy('invoice_list'),
        template_name='admin_pages/confirm_delete.html',
        object_name_field='track_number',
        context_name='invoice'
    ), name='invoice_delete'),

    # ✅ Bulk Delete View
    path('invoices/bulk-delete/', lambda request: bulk_delete_view(
        request,
        model=Invoice,
        template_name='admin_pages/confirm_bulk_delete.html',
        success_url=reverse_lazy('invoice_list'),
        object_name_field='track_number'
    ), name='invoice_bulk_delete'),

    # ✅ Export Excel
    path('invoices/export/excel/', lambda request: export_to_excel_view(
        request,
        model=Invoice,
        fields=['id', 'track_number', 'sender', 'receiver',
                'total_amount', 'amount_paid', 'remain_amount'],
        filename_prefix='invoice_list',
        selected_only=True
    ), name='invoice_export_excel'),

    # ✅ Export PDF
    path('invoices/export/pdf/', lambda request: export_to_pdf_view(
        request,
        model=Invoice,
        fields=['id', 'track_number', 'sender', 'receiver',
                'total_amount', 'amount_paid', 'remain_amount'],
        filename_prefix='invoice_list',
        selected_only=True
    ), name='invoice_export_pdf'),

    # ✅ Invoice Detail View
    path('invoices/<int:pk>/details/',
         views.invoice_detail_view, name='invoice_detail'),

    # ✅ Invoice Print View
    path('invoices/<int:pk>/print/',
         views.invoice_print_view, name='invoice_print'),


    # Items urls:
    path('items/', lambda request: generic_list_view(
        request,
        model=Item,
        template_name='admin_pages/item_list.html',
        context_name='items',
        search_fields=['title', 'details'],
        permission='cargo.view_item',
    ), name='item_list'),

    # Add View
    path('items/add/', lambda request: generic_form_view(
        request,
        model=Item,
        form_class=ItemForm,
        template_name='admin_pages/item_form.html',
        success_url=reverse_lazy('item_list'),
        title='Add Item',
        permission='cargo.add_item'
    ), name='item_add'),

    # Edit View
    path('items/edit/<int:pk>/', lambda request, pk: generic_form_view(
        request,
        model=Item,
        form_class=ItemForm,
        template_name='admin_pages/item_form.html',
        success_url=reverse_lazy('item_list'),
        title='Edit Item',
        object_instance=Item.objects.get(pk=pk),
        permission='cargo.change_item'
    ), name='item_edit'),

    # Delete View
    path('items/delete/<int:pk>/', lambda request, pk: generic_delete_view(
        request,
        model=Item,
        pk=pk,
        success_url=reverse_lazy('item_list'),
        template_name='admin_pages/confirm_delete.html',
        object_name_field='title',
        context_name='item',
        permission='cargo.delete_item'
    ), name='item_delete'),

    # Bulk Delete
    path('items/bulk-delete/', lambda request: bulk_delete_view(
        request,
        model=Item,
        template_name='admin_pages/confirm_bulk_delete.html',
        success_url=reverse_lazy('item_list'),
        object_name_field='title',
        permission='cargo.bulk_delete'
    ), name='item_bulk_delete'),

    # Export Excel
    path('items/export/excel/', lambda request: export_to_excel_view(
        request,
        model=Item,
        fields=['id', 'title', 'measurement_unit', 'details'],
        filename_prefix='item_export',
        selected_only=True,
        permission='cargo.download_excel'
    ), name='item_export_excel'),

    # Export PDF
    path('items/export/pdf/', lambda request: export_to_pdf_view(
        request,
        model=Item,
        fields=['id', 'title', 'measurement_unit', 'details'],
        filename_prefix='item_export',
        selected_only=True,
        permission='cargo.download_pdf'
    ), name='item_export_pdf'),

    # 1. URL patterns (in your `urls.py`)
    path('expenses/print/<int:pk>/',
         views.print_expense_view, name='expense_print'),
    path('expenses/', lambda request: generic_list_view(
        request,
        model=AddExpense,
        template_name='admin_pages/expense_list.html',
        context_name='expenses',
        search_fields=['paid_by', 'paid_to'],
        permission='cargo.view_addexpense'
    ), name='expense_list'),

    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('expense_list'),
        title='Add Expense',
        permission='cargo.add_addexpense'
    ), name='expense_add'),

    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('expense_list'),
        title='Edit Expense',
        object_instance=get_object_or_404(AddExpense, pk=pk),
        permission='cargo.change_addexpense'
    ), name='expense_edit'),

    path('expenses/delete/<int:pk>/', lambda request, pk: generic_delete_view(
        request,
        model=AddExpense,
        pk=pk,
        success_url=reverse_lazy('expense_list'),
        template_name='admin_pages/confirm_delete.html',
        context_name='expense',
        permission='cargo.delete_addexpense'
    ), name='expense_delete'),

    path('expenses/export/', lambda request: export_to_excel_view(
        request,
        model=AddExpense,
        fields=['id', 'paid_by', 'paid_to', 'amount', 'currency', 'date'],
        filename_prefix='expenses_export',
        selected_only=True,
        permission='cargo.expense_download_excel'
    ), name='expense_download_excel'),

    path('expenses/export/pdf/', lambda request: export_to_pdf_view(
        request,
        model=AddExpense,
        fields=['id', 'paid_by', 'paid_to', 'amount', 'currency', 'date'],
        filename_prefix='expenses_report',
        selected_only=True,
        permission='cargo.expense_download_pdf'
    ), name='expense_export_pdf'),

    path('expenses/bulk-delete/', lambda request: bulk_delete_view(
        request,
        model=AddExpense,
        template_name='admin_pages/confirm_bulk_delete.html',
        success_url=reverse_lazy('expense_list'),
        object_name_field='paid_to',
        permission='cargo.expense_bulk_delete'
    ), name='expense_bulk_delete'),

    # Expese category from cargo
    path(
        'expense-categories/delete/<int:pk>/',
        lambda request, pk: generic_delete_view(
            request,
            model=ExpenseCategory,
            pk=pk,
            success_url=reverse_lazy('expense_category_list'),
            template_name='admin_pages/confirm_delete.html',
            object_name_field='name',
            context_name='expense_category',
            permission='cargo.delete_expensecategory',
        ),
        name='expense_category_delete'
    ),
    path('expense-categories/edit/<int:pk>/', lambda request, pk: generic_form_view(
        request,
        model=ExpenseCategory,
        form_class=ExpenseCategoryForm,
        template_name='admin_pages/category_form.html',
        success_url=reverse_lazy('expense_category_list'),
        title='Edit Expense-Category',
        object_instance=ExpenseCategory.objects.get(pk=pk),
        object_name_field='name',
        permission='cargo.change_expensecategory',
    ), name='expense_category_edit'),
    path(
        'expense-categories/export/pdf/',
        lambda request: export_to_pdf_view(
            request,
            model=ExpenseCategory,
            fields=['title', 'remarks'],
            filename_prefix='expense_category_report',
            selected_only=True,
            permission='cargo.download_pdf',
        ),
        name='expense_category_export_pdf',
    ),
    path('expense-categories/export/', lambda request: export_to_excel_view(
        request,
        model=ExpenseCategory,
        fields=['title', 'remarks'],
        filename_prefix='Expense_category_export',
        selected_only=True,
        permission='cargo.download_excel',
        redirect_url_name='expense_category_list',
    ), name='expense_category_export'),
    path('expense-categories/bulk-delete/', lambda request: bulk_delete_view(
        request,
        model=ExpenseCategory,
        template_name='admin_pages/confirm_bulk_delete.html',
        success_url=reverse_lazy('expense_category_list'),
        object_name_field='name',
        permission='cargo.bulk_delete',
    ), name='expense_category_bulk_delete'),
    path('expense-categories/add/', lambda request: generic_form_view(
        request,
        model=ExpenseCategory,
        form_class=ExpenseCategoryForm,
        template_name='admin_pages/expense_category_form.html',
        success_url=reverse_lazy('expense_category_list'),
        title='Add Expense Category',
        object_name_field='title',
    ), name='expense_category_add'),


    path('expense-category/', lambda request: generic_list_view(
        request,
        model=ExpenseCategory,
        template_name='admin_pages/expense_category_list.html',
        context_name='expense_categories',
        search_fields=['title', 'remarks'],
        permission='cargo.view_expensecategory',
        redirect_url_name='admin_page',
    ), name='expense_category_list'),
    # orders urls
    path('orders/<int:pk>/invoice/', lambda request, pk: views.generic_invoice_view(
        request,
        model=Order,
        pk=pk,
        template_name='admin_pages/order_invoice.html',
        context_name='order',
    ), name='order_invoice'),
    path('orders/export/pdf/', lambda request: export_to_pdf_view(
        request,
        model=Order,
        fields=['id', 'full_name', 'phone',
                'total_price', 'created_at'],
        filename_prefix='order_report',
        selected_only=True,  # ✅ export only selected from list
        permission='website.download_pdf',  # ✅ or fallback to view_order
        redirect_url_name='order_list'
    ), name='order_export_pdf'),
    path('orders/export/', lambda request: export_to_excel_view(
        request,
        model=Order,
        fields=['id', 'full_name', 'phone',
                'total_price', 'status', 'created_at'],
        filename_prefix='order_export',
        selected_only=True,  # ✅ export only selected from list
        permission='website.download_excel',  # or use default fallback if not defined
        redirect_url_name='order_list'  # fallback view if permission denied
    ), name='order_export'),
    path('orders/bulk-status/', lambda request: bulk_status_update_view(
        request,
        model=Order,
        success_url=reverse_lazy('order_list'),
        field_name='status',
        valid_choices=Order.STATUS_CHOICES,
        permission='website.bulk_status',
    ), name='order_bulk_status'),

    path('orders/admin/<int:pk>/', lambda request, pk: views.order_detail_view(
        request,
        pk=pk,
        template_name='admin_pages/order_detail.html'
    ), name='order_details'),

    path('orders/', lambda request: generic_list_view(
        request,
        model=Order,
        template_name='admin_pages/order_list.html',
        context_name='orders',
        search_fields=['full_name', 'phone'],
        permission='website.view_order',
        redirect_url_name='dashboard',
        extra_filters={'status': 'status'},
    ), name='order_list'),


    # Product urls
    path('products/', lambda request: generic_list_view(
        request,
        model=Product,
        template_name='admin_pages/product_list.html',
        context_name='product',
        search_fields=['name', 'description'],
        permission='website.view_product',
        redirect_url_name='home',
    ), name='product_list'),

    path('products/add/', lambda request: generic_form_view(
        request,
        model=Product,
        form_class=ProductForm,
        template_name='admin_pages/product_form.html',
        success_url=reverse_lazy('product_list'),
        title='Add Product',
        permission='website.add_product',
    ), name='product_add'),

    path('products/edit/<int:pk>/', lambda request, pk: generic_form_view(
        request,
        model=Product,
        form_class=ProductForm,
        template_name='admin_pages/product_form.html',
        success_url=reverse_lazy('product_list'),
        title='Edit Product',
        object_instance=Product.objects.get(pk=pk),
        permission='website.change_product',
    ), name='product_edit'),

    path('products/delete/<int:pk>/', lambda request, pk: generic_delete_view(
        request,
        model=Product,
        pk=pk,
        success_url=reverse_lazy('product_list'),
        template_name='admin_pages/confirm_delete.html',
        object_name_field='name',
        context_name='product',
        permission='website.delete_product',
    ), name='product_delete'),

    path('products/bulk-delete/', lambda request: bulk_delete_view(
        request,
        model=Product,
        template_name='admin_pages/confirm_bulk_delete.html',
        success_url=reverse_lazy('product_list'),
        object_name_field='name',
        permission='website.bulk_delete',
    ), name='product_bulk_delete'),

    path('products/bulk-status/', lambda request: bulk_status_update_view(
        request,
        model=Product,
        success_url=reverse_lazy('product_list'),
        field_name='is_featured',
        valid_choices=[('True', 'Featured'), ('False', 'Not Featured')],
        permission='website.bulk_status',
    ), name='product_bulk_status'),

    path('products/export/', lambda request: export_to_excel_view(
        request,
        model=Product,
        fields=['id', 'name', 'category', 'price', 'stock', 'is_featured'],
        filename_prefix='product_export',
        selected_only=True,
        permission='website.download_excel',
        redirect_url_name='product_list'
    ), name='product_export'),

    path('products/export/pdf/', lambda request: export_to_pdf_view(
        request,
        model=Product,
        fields=['id', 'name', 'category', 'price', 'stock', 'is_featured'],
        filename_prefix='product_report',
        selected_only=True,
        permission='website.download_pdf',
        redirect_url_name='product_list'
    ), name='product_export_pdf'),

    # Category Related urls
    path(
        'categories/export/pdf/',
        lambda request: export_to_pdf_view(
            request,
            model=Category,
            fields=['id', 'name', 'status'],
            filename_prefix='category_report',
            selected_only=True,
            permission='website.download_pdf',
        ),
        name='category_export_pdf',
    ),

    path('categories/export/', lambda request: export_to_excel_view(
        request,
        model=Category,
        fields=['id', 'name', 'status'],
        filename_prefix='category_export',
        selected_only=True,
        permission='website.download_excel',
        redirect_url_name='category_list',
    ), name='category_export'),

    path('categories/', lambda request: generic_list_view(
        request,
        model=Category,
        template_name='admin_pages/category_list.html',
        context_name='category',
        search_fields=['name'],
        permission='website.view_category',
        redirect_url_name='admin_page',
    ), name='category_list'),

    path('category/add/', lambda request: generic_form_view(
        request,
        model=Category,
        form_class=CategoryForm,
        template_name='admin_pages/category_form.html',
        success_url=reverse('category_list'),
        title='Add Category',
        permission='website.add_category',
    ), name='category_add'),
    path('categories/edit/<int:pk>/', lambda request, pk: generic_form_view(
        request,
        model=Category,
        form_class=CategoryForm,
        template_name='admin_pages/category_form.html',
        success_url=reverse_lazy('category_list'),
        title='Edit Category',
        object_instance=Category.objects.get(pk=pk),
        object_name_field='name',
        permission='website.change_category',
    ), name='category_edit'),
    path(
        'categories/delete/<int:pk>/',
        lambda request, pk: generic_delete_view(
            request,
            model=Category,
            pk=pk,
            success_url=reverse_lazy('category_list'),
            template_name='admin_pages/confirm_delete.html',
            object_name_field='name',
            context_name='category',
            permission='website.delete_category',
        ),
        name='category_delete'
    ),
    path('categories/bulk-delete/', lambda request: bulk_delete_view(
        request,
        model=Category,
        template_name='admin_pages/confirm_bulk_delete.html',
        success_url=reverse_lazy('category_list'),
        object_name_field='name',
        permission='website.bulk_delete',
    ), name='category_bulk_delete'),

    path(
        'categories/bulk-status/',
        lambda request: bulk_status_update_view(
            request,
            model=Category,
            success_url=reverse_lazy('category_list'),
            field_name='status',
            valid_choices=Category.STATUS_CHOICES,
            permission='website.bulk_status',
        ),
        name='category_bulk_status',
    ),

    path("admin-dashboard/", views.admin_page, name="admin_page"),
    path("subscribe/", views.newsletter_subscribe, name="newsletter_subscribe"),
    path("cargo-info/", views.cargo_info, name="cargo_info"),
    path("faq/", views.faq_page, name="faq_page"),
    path("like-faq/<int:faq_id>/", views.like_faq, name="like_faq"),
    path("dislike-faq/<int:faq_id>/", views.dislike_faq, name="dislike_faq"),
    path("like-answer/<int:answer_id>/", views.like_answer, name="like_answer"),
    path("dislike-answer/<int:answer_id>/",
         views.dislike_answer, name="dislike_answer"),
    path("admin-faqs/", views.admin_faq_dashboard, name="admin_faq_dashboard"),
    path("faq/", views.faq_page, name="faq_page"),
    path("submit-question/", views.submit_question, name="submit_question"),
    path("submit-answer/<int:faq_id>/",
         views.submit_answer, name="submit_answer"),
    path("add-answer-comment/<int:answer_id>/",
         views.add_answer_comment, name="add_answer_comment"),
    path('reply-to-review/<int:review_id>/',
         views.reply_to_review, name='reply_to_review'),
    path('wishlist/', views.wishlist, name='wishlist'),
    path('wishlist/add/<int:product_id>/',
         views.add_to_wishlist, name='add_to_wishlist'),
    path('wishlist/remove/<int:product_id>/',
         views.remove_from_wishlist, name='remove_from_wishlist'),
    path("submit-review/<int:product_id>/",
         views.submit_review, name="submit_review"),
    path('product/<int:pk>/', views.product_detail,
         name='product_detail'),  # Use pk
    path('rate-product/<int:product_id>/',
         views.rate_product, name='rate_product'),
    path('password-reset/', auth_views.PasswordResetView.as_view(
        template_name='shop/password_reset_form.html'), name='password_reset'),
    path('password-reset/done/', auth_views.PasswordResetDoneView.as_view(
        template_name='shop/password_reset_done.html'), name='password_reset_done'),
    path('reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(
        template_name='shop/password_reset_confirm.html'), name='password_reset_confirm'),
    path('reset/done/', auth_views.PasswordResetCompleteView.as_view(
        template_name='shop/password_reset_complete.html'), name='password_reset_complete'),

    path("testimonials/", views.testimonials_view, name="testimonials"),
    path("submit-testimonial/", views.submit_testimonial,
         name="submit_testimonial"),
    path("submit-testimonial-page/", views.submit_testimonial_page,
         name="submit_testimonial_page"),
    path("blog/", views.blog, name="blog"),
    # Make sure this line exists
    path("blog/<int:blog_id>/", views.blog_detail, name="blog_detail"),
    path("order/<int:order_id>/invoice/",
         views.generate_invoice, name="generate_invoice"),
    path("order/<int:order_id>/", views.order_detail,
         name="order_detail"),  # ✅ Add this
    path("my-orders/", views.my_orders, name="my_orders"),  # ✅ Add this URL
    path("logout/", auth_views.LogoutView.as_view(next_page="home"),
         name="logout"),  # ✅ Add Logout
    path("profile/", views.profile_view, name="profile"),
    path('edit-profile/', views.edit_profile, name='edit_profile'),
    path("register/", views.register_view, name="register"),  # ✅ Add this line
    path("login/", views.login_view, name="login"),  # ✅ Custom login URL
    path('checkout/', views.checkout, name='checkout'),
    path('process-checkout/', views.process_checkout, name='process_checkout'),
    path('order-success/', views.order_success,
         name='order_success'),  # ✅ Add this line
    path('shop/', views.shop, name='shop'),
    path("live-search/", views.live_search,
         name="live_search"),  # ✅ AJAX search
    path('', views.home, name='home'),
    path("compare-products/", views.compare_products, name="compare_products"),
    path('about/', views.about_us, name='about_us'),  # Add this line
    path('product/<int:pk>/', views.product_detail, name='product_detail'),
    path('add-to-cart/<int:product_id>/',
         views.add_to_cart, name='add_to_cart'),
    path('add-to-cart/basket/<int:product_id>/',
         views.add_to_cart_at_basket, name='add_to_cart_at_basket'),
    path('cart-summary/', views.cart_summary, name='cart_summary'),
    path('remove-from-cart/<int:product_id>/',
         views.remove_from_cart, name='remove_from_cart'),
    path('cart/clear/', views.clear_cart, name='clear_cart'),
    path('contact/', views.contact, name='contact'),


]
