from django import forms
from django.contrib import admin

from .models import Client, ClientBranch, ClientUserMembership


class ClientAdminForm(forms.ModelForm):
    class Meta:
        model = Client
        fields = "__all__"
        widgets = {
            "xero_oauth_client_secret": forms.PasswordInput(render_value=True),
            "xero_oauth_refresh_token": forms.PasswordInput(render_value=True),
        }


class ClientBranchInlineForm(forms.ModelForm):
    class Meta:
        model = ClientBranch
        fields = "__all__"
        widgets = {
            "simpro_api_key": forms.PasswordInput(render_value=True),
            "xero_tenant_id": forms.PasswordInput(render_value=True),
        }
        help_texts = {
            "branch_id": "Stable identifier used by API routing (e.g. branch1, branch2).",
            "xero_department_to_option": "JSON map, e.g. {\"Electrical\": \"Residential\", \"Air\": \"Air Conditioning\"}",
            "xero_department_to_company_id": "JSON map, e.g. {\"Electrical\": 139, \"Air\": 172}",
        }


class ClientBranchInline(admin.TabularInline):
    model = ClientBranch
    form = ClientBranchInlineForm
    extra = 1
    fields = (
        "branch_id",
        "branch_name",
        "simpro_api_url",
        "simpro_api_key",
        "xero_enabled",
        "xero_tenant_id",
        "xero_tracking_category_name",
        "xero_department_to_option",
        "xero_department_to_company_id",
    )


class ClientUserMembershipInline(admin.TabularInline):
    model = ClientUserMembership
    extra = 0
    autocomplete_fields = ("user",)
    fields = ("user", "is_active", "created_at")
    readonly_fields = ("created_at",)


@admin.register(Client)
class ClientAdmin(admin.ModelAdmin):
    form = ClientAdminForm
    list_display = ("name", "slug", "subdomain", "use_demo_data", "is_active", "created_at", "branch_count", "member_count")
    search_fields = ("name", "slug", "subdomain")
    list_filter = ("use_demo_data", "is_active", "created_at")
    prepopulated_fields = {"slug": ("name",), "subdomain": ("name",)}
    inlines = (ClientBranchInline, ClientUserMembershipInline)
    readonly_fields = ("created_at", "updated_at")
    fieldsets = (
        ("Client", {"fields": ("name", "slug", "subdomain", "use_demo_data", "is_active")}),
        (
            "Branding",
            {
                "fields": ("company_display_name", "logo"),
                "description": "Login page and app header. Leave display name blank to use the client name.",
            },
        ),
        (
            "Xero OAuth (optional)",
            {
                "fields": ("xero_oauth_client_id", "xero_oauth_client_secret", "xero_oauth_refresh_token"),
                "description": "When all three are set, this tenant uses these credentials instead of the root .env "
                "for Xero API calls. The refresh token is rotated on refresh and saved back to this row.",
            },
        ),
        (
            "Feature flags",
            {
                "fields": ("features",),
                "description": 'JSON object, e.g. {"job_efficiency_csv": true} enables Nixon-style CSV job efficiency.',
            },
        ),
        ("Timestamps", {"fields": ("created_at", "updated_at")}),
    )

    def branch_count(self, obj):
        return obj.branches.count()

    def member_count(self, obj):
        return obj.memberships.filter(is_active=True).count()


@admin.register(ClientBranch)
class ClientBranchAdmin(admin.ModelAdmin):
    list_display = ("client", "branch_id", "branch_name", "xero_enabled", "updated_at")
    search_fields = ("client__name", "client__slug", "branch_id", "branch_name")
    list_filter = ("xero_enabled", "client")
    readonly_fields = ("created_at", "updated_at")


@admin.register(ClientUserMembership)
class ClientUserMembershipAdmin(admin.ModelAdmin):
    list_display = ("client", "user", "is_active", "created_at")
    search_fields = ("client__name", "client__slug", "user__username")
    list_filter = ("is_active", "client")
    autocomplete_fields = ("client", "user")
    readonly_fields = ("created_at",)
