# -*- coding: utf-8 -*-
from django.contrib import admin
from django.utils.html import format_html

from .models import Order, OrderItem


class OrderItemInline(admin.TabularInline):
    """The books on this order. Written by the website, read-only here."""
    model = OrderItem
    extra = 0
    can_delete = False
    fields = ('book_name', 'book_name_en', 'pages', 'unit_price', 'quantity', 'line_total')
    readonly_fields = fields

    def has_add_permission(self, request, obj=None):
        return False


@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
    list_display = (
        'order_no', 'created_at', 'customer_name', 'phone_link',
        'what_was_ordered', 'quantity', 'delivery_area', 'shipping', 'total_taka', 'status',
    )
    list_display_links = ('order_no', 'customer_name')
    list_filter = ('status', 'is_full_set', 'delivery_area', 'created_at', 'gift_size')
    search_fields = ('order_no', 'customer_name', 'phone', 'phone_typed', 'address',
                     'books_summary', 'items__book_name_en')
    date_hierarchy = 'created_at'
    list_per_page = 50
    list_editable = ('status',)
    ordering = ('-created_at',)
    inlines = [OrderItemInline]

    readonly_fields = (
        'order_no', 'created_at', 'updated_at',
        'is_full_set', 'books_count', 'books_summary',
        'product_name', 'product_name_en', 'product_sku',
        'unit_price', 'subtotal', 'delivery_charge', 'total',
        'gift', 'ip_address', 'user_agent', 'phone_typed',
    )

    fieldsets = (
        ('Order', {
            'fields': ('order_no', 'status', 'created_at', 'updated_at'),
        }),
        ('Customer', {
            'fields': ('customer_name', 'phone', 'phone_typed', 'address', 'country'),
        }),
        ('What was ordered', {
            'fields': ('is_full_set', 'books_count', 'books_summary',
                       'product_name', 'product_name_en', 'product_sku'),
            'description': 'The individual books are listed at the bottom of this page.',
        }),
        ('Money', {
            'fields': ('quantity', 'unit_price', 'subtotal',
                       'delivery_area', 'delivery_charge', 'total'),
            'description': 'A full set costs the set price and ships free. '
                           'Single books are added up and pay the normal delivery charge.',
        }),
        ('Free gift', {
            'fields': ('gift', 'gift_size'),
        }),
        ('Note', {
            'fields': ('admin_note',),
        }),
        ('Technical', {
            'classes': ('collapse',),
            'fields': ('ip_address', 'user_agent'),
        }),
    )

    def get_queryset(self, request):
        # the list page reads items for the summary column
        return super().get_queryset(request).prefetch_related('items')

    @admin.display(description='Mobile', ordering='phone')
    def phone_link(self, obj):
        if not obj.dialable_phone:
            return obj.phone
        return format_html('<a href="tel:{}">{}</a>', obj.dialable_phone, obj.phone)

    @admin.display(description='Books', ordering='books_count')
    def what_was_ordered(self, obj):
        if obj.is_full_set:
            return format_html(
                '<b style="color:#0a7d34">FULL SET</b><br>'
                '<span style="font-size:11px">{} books</span>', obj.books_count)
        names = ', '.join(i.book_name_en or i.book_name for i in obj.items.all())
        return format_html(
            '<b>{} book{}</b><br><span style="font-size:11px">{}</span>',
            obj.books_count, '' if obj.books_count == 1 else 's', names or obj.books_summary)

    @admin.display(description='Shipping', ordering='delivery_charge')
    def shipping(self, obj):
        if obj.delivery_charge == 0:
            # format_html needs at least one argument, so the word is passed in.
            return format_html('<b style="color:#0a7d34">{}</b>', 'FREE')
        return 'Tk {:,}'.format(obj.delivery_charge)

    @admin.display(description='Total', ordering='total')
    def total_taka(self, obj):
        return 'Tk {:,}'.format(obj.total)

    # ---- bulk actions ----
    @admin.action(description='Mark selected orders as Confirmed')
    def mark_confirmed(self, request, queryset):
        updated = queryset.update(status=Order.STATUS_CONFIRMED)
        self.message_user(request, '%d order(s) marked as confirmed.' % updated)

    @admin.action(description='Mark selected orders as Shipped')
    def mark_shipped(self, request, queryset):
        updated = queryset.update(status=Order.STATUS_SHIPPED)
        self.message_user(request, '%d order(s) marked as shipped.' % updated)

    @admin.action(description='Mark selected orders as Delivered')
    def mark_delivered(self, request, queryset):
        updated = queryset.update(status=Order.STATUS_DELIVERED)
        self.message_user(request, '%d order(s) marked as delivered.' % updated)

    @admin.action(description='Mark selected orders as Cancelled')
    def mark_cancelled(self, request, queryset):
        updated = queryset.update(status=Order.STATUS_CANCELLED)
        self.message_user(request, '%d order(s) marked as cancelled.' % updated)

    actions = ['mark_confirmed', 'mark_shipped', 'mark_delivered', 'mark_cancelled']

    def has_add_permission(self, request):
        # Orders arrive from the website; nothing is typed in by hand here.
        return False
