"""
Django Admin configuration for TheStarFX Trading Platform.

Uses django-jazzmin for a modern, Bootstrap-based admin UI.
All models are registered with rich fieldsets, filters, and
human-readable display enhancements.
"""

from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.utils.html import format_html
from django.utils.safestring import mark_safe

from .models import (
    Bot,
    ContentBlock,
    SiteSettings,
    NavigationItem,
    ForexPair,
    Lesson,
    Signal,
    News,
    Testimonial,
    LeaderboardEntry,
)


@admin.register(ContentBlock)
class ContentBlockAdmin(admin.ModelAdmin):
    list_display = ("section", "page", "display_order", "key", "is_published", "updated_at")
    list_filter = ("page", "is_published")
    search_fields = ("key", "page", "section", "title", "body")
    readonly_fields = ("created_at", "updated_at")
    ordering = ("page", "display_order", "section")

    fieldsets = (
        ("Placement", {"fields": ("key", "page", "section", "display_order", "is_published")}),
        ("Copy", {"fields": ("eyebrow", "title", "highlight_text", "body")}),
        ("Calls to action", {
            "fields": (
                "primary_cta_label", "primary_cta_url",
                "secondary_cta_label", "secondary_cta_url",
            )
        }),
        ("Structured content", {"fields": ("content_json",)}),
        ("Timestamps", {"fields": ("created_at", "updated_at"), "classes": ("collapse",)}),
    )


@admin.register(SiteSettings)
class SiteSettingsAdmin(admin.ModelAdmin):
    list_display = ("site_name", "support_email", "updated_at")
    readonly_fields = ("updated_at",)
    fieldsets = (
        ("Brand", {"fields": ("key", "site_name", "site_tagline", "logo_url")}),
        ("Header labels", {"fields": ("learn_menu_label", "more_menu_label", "sign_in_label", "register_label")}),
        ("Footer", {"fields": ("footer_platform_label", "footer_learn_label", "footer_contact_label", "footer_description", "support_email", "support_location", "copyright_text")}),
        ("Social links", {"fields": ("telegram_url", "discord_url", "x_url", "instagram_url")}),
        ("Updated", {"fields": ("updated_at",)}),
    )


@admin.register(NavigationItem)
class NavigationItemAdmin(admin.ModelAdmin):
    list_display = ("label", "location", "url", "order", "is_active")
    list_filter = ("location", "is_active", "open_new_tab")
    search_fields = ("label", "url", "description")
    ordering = ("location", "order", "id")


# ---------------------------------------------------------------------------
# Helper: colored badge renderer
# ---------------------------------------------------------------------------

def _badge(text: str, color: str) -> str:
    """Return a Bootstrap badge span for list_display columns."""
    return format_html(
        '<span style="background:{color};color:#fff;padding:3px 10px;'
        'border-radius:12px;font-size:0.78em;font-weight:600;">{text}</span>',
        color=color,
        text=text,
    )


STATUS_COLORS = {
    "active":   "#28a745",
    "beta":     "#fd7e14",
    "inactive": "#6c757d",
}

SIGNAL_COLORS = {
    "buy":  "#28a745",
    "sell": "#dc3545",
    "hold": "#ffc107",
}

IMPACT_COLORS = {
    "high":   "#dc3545",
    "medium": "#fd7e14",
    "low":    "#28a745",
}

TREND_COLORS = {
    "up":       "#28a745",
    "down":     "#dc3545",
    "sideways": "#6c757d",
}

DIFFICULTY_COLORS = {
    "beginner":     "#28a745",
    "intermediate": "#fd7e14",
    "advanced":     "#dc3545",
}

PLAN_COLORS = {
    "Basic": "#6c757d",
    "Pro":   "#007bff",
    "VIP":   "#ffc107",
}



admin.site.unregister(User)


@admin.register(User)
class EnhancedUserAdmin(BaseUserAdmin):
    list_display = ("username", "email", "first_name", "last_name", "is_staff", "is_active", "date_joined")
    list_filter = ("is_staff", "is_superuser", "is_active", "groups")
    search_fields = ("username", "email", "first_name", "last_name")
    ordering = ("-date_joined",)
    list_per_page = 20
    save_on_top = True
    show_full_result_count = False


# ---------------------------------------------------------------------------
# Bot Admin
# ---------------------------------------------------------------------------

@admin.register(Bot)
class BotAdmin(admin.ModelAdmin):
    # ── List view ───────────────────────────────────────────────────────────
    list_display = (
        "name",
        "category",
        "colored_status",
        "colored_plan",
        "price_display",
        "win_rate_display",
        "monthly_return_display",
        "created_at",
    )
    list_display_links = ("name",)
    list_filter = ("status", "plan", "category", "timeframe")
    search_fields = ("name", "description", "tags")
    date_hierarchy = "created_at"
    ordering = ("-created_at",)
    list_per_page = 20
    save_on_top = True
    show_full_result_count = False

    # ── Form layout ─────────────────────────────────────────────────────────
    readonly_fields = ("created_at", "updated_at")
    fieldsets = (
        ("📋 Basic Information", {
            "fields": ("name", "description", "category", "badge", "tags"),
        }),
        ("💱 Trading Configuration", {
            "fields": ("pairs", "timeframe"),
            "classes": ("collapse",),
        }),
        ("📈 Performance Metrics", {
            "fields": (
                "win_rate", "total_trades", "avg_profit",
                "max_drawdown", "monthly_return", "sharpe_ratio",
                "backtest_years",
            ),
        }),
        ("💲 Pricing & Status", {
            "fields": ("price", "plan", "status"),
        }),
        ("📊 Chart Data", {
            "fields": ("chart_data",),
            "classes": ("collapse",),
        }),
        ("🕓 Timestamps", {
            "fields": ("created_at", "updated_at"),
            "classes": ("collapse",),
        }),
    )

    # ── Custom columns ───────────────────────────────────────────────────────
    @admin.display(description="Status", ordering="status")
    def colored_status(self, obj):
        color = STATUS_COLORS.get(obj.status, "#6c757d")
        return _badge(obj.get_status_display(), color)

    @admin.display(description="Plan", ordering="plan")
    def colored_plan(self, obj):
        color = PLAN_COLORS.get(obj.plan, "#6c757d")
        return _badge(obj.plan, color)

    @admin.display(description="Price ($)", ordering="price")
    def price_display(self, obj):
        return f"${obj.price:,.2f}"

    @admin.display(description="Win Rate", ordering="win_rate")
    def win_rate_display(self, obj):
        color = "#28a745" if obj.win_rate >= 60 else "#fd7e14" if obj.win_rate >= 45 else "#dc3545"
        rate_str = f"{obj.win_rate:.1f}%"
        return format_html(
            '<span style="color:{};font-weight:600;">{}</span>',
            color,
            rate_str,
        )

    @admin.display(description="Monthly Return", ordering="monthly_return")
    def monthly_return_display(self, obj):
        color = "#28a745" if obj.monthly_return >= 0 else "#dc3545"
        sign = "+" if obj.monthly_return >= 0 else ""
        val_str = f"{sign}{obj.monthly_return:.1f}%"
        return format_html(
            '<span style="color:{};font-weight:600;">{}</span>',
            color,
            val_str,
        )


# ---------------------------------------------------------------------------
# ForexPair Admin
# ---------------------------------------------------------------------------

@admin.register(ForexPair)
class ForexPairAdmin(admin.ModelAdmin):
    list_display = (
        "pair",
        "category",
        "price_display",
        "change_pct_display",
        "colored_trend",
        "sentiment_bar",
        "updated_at",
    )
    list_display_links = ("pair",)
    list_filter = ("category", "trend")
    search_fields = ("pair", "base", "quote")
    ordering = ("pair",)
    list_per_page = 25
    save_on_top = True
    show_full_result_count = False
    readonly_fields = ("created_at", "updated_at")

    fieldsets = (
        ("💱 Pair Identity", {
            "fields": ("pair", "base", "quote", "symbol1", "symbol2", "color1", "color2", "category"),
        }),
        ("📊 Market Data", {
            "fields": ("price", "bid", "ask", "spread", "high", "low", "change", "change_pct", "volume"),
        }),
        ("📉 Analysis", {
            "fields": ("trend", "sentiment"),
        }),
        ("🕓 Timestamps", {
            "fields": ("created_at", "updated_at"),
            "classes": ("collapse",),
        }),
    )

    @admin.display(description="Price", ordering="price")
    def price_display(self, obj):
        return f"{obj.price:.5f}"

    @admin.display(description="Change %", ordering="change_pct")
    def change_pct_display(self, obj):
        color = "#28a745" if obj.change_pct >= 0 else "#dc3545"
        sign = "+" if obj.change_pct >= 0 else ""
        val_str = f"{sign}{float(obj.change_pct):.2f}%"
        return format_html(
            '<span style="color:{};font-weight:600;">{}</span>',
            color,
            val_str,
        )

    @admin.display(description="Trend", ordering="trend")
    def colored_trend(self, obj):
        icons = {"up": "▲", "down": "▼", "sideways": "→"}
        color = TREND_COLORS.get(obj.trend, "#6c757d")
        icon = icons.get(obj.trend, "")
        return format_html(
            '<span style="color:{color};font-weight:700;">{icon} {label}</span>',
            color=color,
            icon=icon,
            label=obj.get_trend_display(),
        )

    @admin.display(description="Sentiment", ordering="sentiment")
    def sentiment_bar(self, obj):
        pct = obj.sentiment
        color = "#28a745" if pct >= 60 else "#fd7e14" if pct >= 40 else "#dc3545"
        return format_html(
            '<div style="background:#e9ecef;border-radius:8px;width:80px;display:inline-block;">'
            '<div style="background:{color};width:{pct}%;height:12px;border-radius:8px;"></div>'
            '</div> <small>{pct}%</small>',
            color=color,
            pct=pct,
        )


# ---------------------------------------------------------------------------
# Lesson Admin
# ---------------------------------------------------------------------------

@admin.register(Lesson)
class LessonAdmin(admin.ModelAdmin):
    list_display = (
        "title",
        "category",
        "colored_difficulty",
        "duration_display",
        "order",
        "created_at",
    )
    list_display_links = ("title",)
    list_filter = ("category", "difficulty")
    search_fields = ("title", "description", "tags")
    date_hierarchy = "created_at"
    ordering = ("order", "created_at")
    list_per_page = 20
    save_on_top = True
    show_full_result_count = False
    readonly_fields = ("created_at", "updated_at")

    fieldsets = (
        ("📚 Lesson Details", {
            "fields": ("title", "description", "category", "difficulty", "order", "tags"),
        }),
        ("🎬 Media", {
            "fields": ("image_url", "video_url"),
        }),
        ("📝 Content", {
            "fields": ("content", "duration_minutes"),
        }),
        ("🕓 Timestamps", {
            "fields": ("created_at", "updated_at"),
            "classes": ("collapse",),
        }),
    )

    @admin.display(description="Difficulty", ordering="difficulty")
    def colored_difficulty(self, obj):
        color = DIFFICULTY_COLORS.get(obj.difficulty, "#6c757d")
        return _badge(obj.get_difficulty_display(), color)

    @admin.display(description="Duration", ordering="duration_minutes")
    def duration_display(self, obj):
        mins = obj.duration_minutes
        if mins >= 60:
            return f"{mins // 60}h {mins % 60}m"
        return f"{mins} min"


# ---------------------------------------------------------------------------
# Signal Admin
# ---------------------------------------------------------------------------

@admin.register(Signal)
class SignalAdmin(admin.ModelAdmin):
    list_display = (
        "pair",
        "colored_signal_type",
        "confidence_display",
        "entry_price",
        "stop_loss",
        "take_profit",
        "created_at",
        "expires_at",
    )
    list_display_links = ("pair",)
    list_filter = ("signal_type", "pair")
    search_fields = ("pair", "reason", "chart_pattern")
    date_hierarchy = "created_at"
    ordering = ("-created_at",)
    list_per_page = 20
    save_on_top = True
    show_full_result_count = False
    readonly_fields = ("created_at",)

    fieldsets = (
        ("📡 Signal Details", {
            "fields": ("pair", "signal_type", "confidence", "chart_pattern"),
        }),
        ("💰 Price Levels", {
            "fields": ("entry_price", "stop_loss", "take_profit"),
        }),
        ("📝 Analysis", {
            "fields": ("reason",),
        }),
        ("🕓 Timestamps", {
            "fields": ("created_at", "expires_at"),
        }),
    )

    @admin.display(description="Signal", ordering="signal_type")
    def colored_signal_type(self, obj):
        color = SIGNAL_COLORS.get(obj.signal_type, "#6c757d")
        icons = {"buy": "↑", "sell": "↓", "hold": "—"}
        icon = icons.get(obj.signal_type, "")
        return format_html(
            '<span style="background:{color};color:#fff;padding:3px 10px;border-radius:12px;'
            'font-size:0.78em;font-weight:700;">{icon} {label}</span>',
            color=color,
            icon=icon,
            label=obj.get_signal_type_display(),
        )

    @admin.display(description="Confidence", ordering="confidence")
    def confidence_display(self, obj):
        pct = obj.confidence
        color = "#28a745" if pct >= 75 else "#fd7e14" if pct >= 50 else "#dc3545"
        return format_html(
            '<div style="background:#e9ecef;border-radius:8px;width:80px;display:inline-block;">'
            '<div style="background:{color};width:{pct}%;height:12px;border-radius:8px;"></div>'
            '</div> <small style="color:{color};font-weight:600;">{pct}%</small>',
            color=color,
            pct=pct,
        )


# ---------------------------------------------------------------------------
# News Admin
# ---------------------------------------------------------------------------

@admin.register(News)
class NewsAdmin(admin.ModelAdmin):
    list_display = (
        "title",
        "category",
        "colored_impact",
        "source",
        "published_at",
    )
    list_display_links = ("title",)
    list_filter = ("category", "impact", "source")
    search_fields = ("title", "content", "source")
    date_hierarchy = "published_at"
    ordering = ("-published_at",)
    list_per_page = 20
    save_on_top = True
    show_full_result_count = False
    readonly_fields = ("created_at",)

    fieldsets = (
        ("📰 News Details", {
            "fields": ("title", "category", "impact", "source", "related_pairs"),
        }),
        ("🖼 Media", {
            "fields": ("image_url",),
        }),
        ("📄 Content", {
            "fields": ("content",),
        }),
        ("🕓 Timestamps", {
            "fields": ("created_at", "published_at"),
        }),
    )

    @admin.display(description="Impact", ordering="impact")
    def colored_impact(self, obj):
        color = IMPACT_COLORS.get(obj.impact, "#6c757d")
        icons = {"high": "🔴", "medium": "🟠", "low": "🟢"}
        icon = icons.get(obj.impact, "")
        return format_html(
            '{icon} <span style="color:{color};font-weight:600;">{label}</span>',
            icon=icon,
            color=color,
            label=obj.get_impact_display(),
        )


# ---------------------------------------------------------------------------
# Testimonial Admin
# ---------------------------------------------------------------------------

@admin.register(Testimonial)
class TestimonialAdmin(admin.ModelAdmin):
    list_display = (
        "author_name",
        "author_title",
        "star_rating",
        "content_preview",
        "created_at",
    )
    list_display_links = ("author_name",)
    list_filter = ("rating",)
    search_fields = ("author_name", "content", "author_title")
    date_hierarchy = "created_at"
    ordering = ("-created_at",)
    list_per_page = 20
    save_on_top = True
    show_full_result_count = False
    readonly_fields = ("created_at",)

    fieldsets = (
        ("👤 Author", {
            "fields": ("author_name", "author_title", "author_image"),
        }),
        ("⭐ Review", {
            "fields": ("content", "rating"),
        }),
        ("🕓 Timestamps", {
            "fields": ("created_at",),
        }),
    )

    @admin.display(description="Rating", ordering="rating")
    def star_rating(self, obj):
        stars = "⭐" * obj.rating + "☆" * (5 - obj.rating)
        color = "#ffc107" if obj.rating >= 4 else "#fd7e14" if obj.rating == 3 else "#dc3545"
        return format_html(
            '<span style="color:{color};font-size:1em;" title="{rating}/5">{stars}</span>',
            color=color,
            rating=obj.rating,
            stars=stars,
        )

    @admin.display(description="Review")
    def content_preview(self, obj):
        preview = (obj.content[:80] + "…") if len(obj.content) > 80 else obj.content
        return preview


# ---------------------------------------------------------------------------
# LeaderboardEntry Admin
# ---------------------------------------------------------------------------

@admin.register(LeaderboardEntry)
class LeaderboardEntryAdmin(admin.ModelAdmin):
    list_display = (
        "rank_badge",
        "user_name",
        "monthly_return_display",
        "win_rate_display",
        "total_trades",
        "profit_display",
        "updated_at",
    )
    list_display_links = ("user_name",)
    list_filter = ("rank",)
    search_fields = ("user_name",)
    ordering = ("rank",)
    list_per_page = 20
    save_on_top = True
    show_full_result_count = False
    readonly_fields = ("created_at", "updated_at")

    fieldsets = (
        ("🏆 Ranking", {
            "fields": ("rank", "user_name", "avatar"),
        }),
        ("📈 Performance", {
            "fields": ("monthly_return", "win_rate", "total_trades", "profit"),
        }),
        ("🕓 Timestamps", {
            "fields": ("created_at", "updated_at"),
            "classes": ("collapse",),
        }),
    )

    @admin.display(description="#", ordering="rank")
    def rank_badge(self, obj):
        medals = {1: "🥇", 2: "🥈", 3: "🥉"}
        medal = medals.get(obj.rank, "")
        color = "#ffc107" if obj.rank <= 3 else "#007bff" if obj.rank <= 10 else "#6c757d"
        return format_html(
            '<span style="color:{color};font-weight:700;">{medal} #{rank}</span>',
            color=color,
            medal=medal,
            rank=obj.rank,
        )

    @admin.display(description="Monthly Return", ordering="monthly_return")
    def monthly_return_display(self, obj):
        color = "#28a745" if obj.monthly_return >= 0 else "#dc3545"
        sign = "+" if obj.monthly_return >= 0 else ""
        val_str = f"{sign}{obj.monthly_return:.1f}%"
        return format_html(
            '<span style="color:{};font-weight:600;">{}</span>',
            color,
            val_str,
        )

    @admin.display(description="Win Rate", ordering="win_rate")
    def win_rate_display(self, obj):
        color = "#28a745" if obj.win_rate >= 60 else "#fd7e14" if obj.win_rate >= 45 else "#dc3545"
        val_str = f"{obj.win_rate:.1f}%"
        return format_html(
            '<span style="color:{};font-weight:600;">{}</span>',
            color,
            val_str,
        )

    @admin.display(description="Profit ($)", ordering="profit")
    def profit_display(self, obj):
        color = "#28a745" if obj.profit >= 0 else "#dc3545"
        val_str = f"${float(obj.profit):,.2f}"
        return format_html(
            '<span style="color:{};font-weight:600;">{}</span>',
            color,
            val_str,
        )
