"""Companies list, detail view, and tier-edit endpoints."""

from flask import (
    Blueprint, render_template, request, g, session as flask_session,
)

from webapp.auth import login_required, role_required
from webapp.dates import resolve_date_range, PERIOD_PRESETS, DEFAULT_PERIOD
from icp_db import list_companies, get_company_detail, update_company_tier

companies_bp = Blueprint("companies", __name__)

# Tier value -> display label mapping
TIER_LABELS = {"1": "Tier 1 ICP", "2": "Tier 2 ICP", "Not ICP": "Not ICP"}
VALID_TIERS = ("1", "2", "Not ICP", "")


@companies_bp.route("/companies")
@login_required
def index():
    role = flask_session.get("role", "viewer")
    return render_template(
        "companies.html",
        role=role,
        default_tier="1",
        period_presets=PERIOD_PRESETS,
        default_period=DEFAULT_PERIOD,
    )


@companies_bp.route("/companies/table")
@login_required
def table():
    """htmx partial: filtered, paginated, sorted companies table."""
    db = g.db
    role = flask_session.get("role", "viewer")

    # Date range
    date_from, date_to, active_period = resolve_date_range(
        request.args.get("period"),
        request.args.get("date_from"),
        request.args.get("date_to"),
    )

    result = list_companies(
        db,
        tier=request.args.get("tier") or None,
        search=request.args.get("search") or None,
        sort_by=request.args.get("sort_by", "company"),
        sort_dir=request.args.get("sort_dir", "asc"),
        page=int(request.args.get("page", 1)),
        per_page=50,
        date_from=date_from,
        date_to=date_to,
    )

    has_date_filter = active_period != "all"

    return render_template(
        "partials/companies_table.html",
        companies=result["items"],
        total=result["total"],
        page=result["page"],
        pages=result["pages"],
        sort_by=request.args.get("sort_by", "company"),
        sort_dir=request.args.get("sort_dir", "asc"),
        role=role,
        tier_labels=TIER_LABELS,
        has_date_filter=has_date_filter,
        current_filters={
            "tier": request.args.get("tier", ""),
            "search": request.args.get("search", ""),
            "period": active_period,
            "date_from": date_from.isoformat() if date_from else "",
            "date_to": date_to.isoformat() if date_to else "",
        },
    )


@companies_bp.route("/companies/<path:company_name>")
@login_required
def detail(company_name):
    db = g.db
    company = get_company_detail(db, company_name)
    if not company:
        return render_template("base.html", error="Company not found."), 404

    role = flask_session.get("role", "viewer")
    return render_template(
        "company_detail.html",
        company=company,
        role=role,
        tier_labels=TIER_LABELS,
        valid_tiers=VALID_TIERS,
    )


@companies_bp.route("/companies/<path:company_name>/tier", methods=["PATCH"])
@role_required("editor")
def change_tier(company_name):
    """htmx inline tier change."""
    db = g.db
    new_tier = request.form.get("tier", "")
    if new_tier not in VALID_TIERS:
        return "Invalid tier", 400

    result = update_company_tier(db, company_name, new_tier)
    reclassified = result["contacts_reclassified"]

    tier_display = TIER_LABELS.get(new_tier, "—")
    tier_class = "tier" + new_tier.lower().replace(" ", "") if new_tier else ""
    html = f'<span class="tier-badge {tier_class}">{tier_display}</span>'
    if reclassified > 0:
        html += f' <span class="saved-indicator">{reclassified} ICP contact(s) reclassified</span>'
    else:
        html += ' <span class="saved-indicator">Saved</span>'
    return html
