from __future__ import annotations

from typing import Any

from ..spec_models import ChartType, EntitySpec


QINGBI_CHART_TYPE_MAP = {
    ChartType.bar: "bar",
    ChartType.line: "line",
    ChartType.pie: "pie",
    ChartType.summary: "indicator",
    ChartType.data: "detail",
    ChartType.target: "indicator",
    ChartType.funnel: "funnel",
}


def qingbi_workspace_visible_auth() -> dict[str, Any]:
    return {
        "type": "ws",
        "contactAuth": {
            "type": "all",
            "authMembers": {
                "member": [],
                "depart": [],
                "role": [],
                "includeSubDeparts": True,
            },
        },
        "externalMemberAuth": {
            "type": "not",
            "authMembers": {
                "member": [],
                "depart": [],
                "role": [],
            },
        },
    }


def compile_charts(entity: EntitySpec) -> list[dict[str, Any]]:
    plans: list[dict[str, Any]] = []
    field_labels = {field.field_id: field.label for field in entity.fields}
    for ordinal, chart in enumerate(entity.charts, start=1):
        config = dict(chart.config)
        aggregate = config.pop("aggregate", "count")
        after_filters = list(config.pop("after_aggregation_filters", []))
        query_condition_field_ids = list(config.pop("query_condition_field_ids", []))
        query_condition_status = bool(config.pop("query_condition_status", bool(query_condition_field_ids)))
        query_condition_exact = bool(config.pop("query_condition_exact", False))
        plans.append(
            {
                "chart_id": chart.chart_id,
                "name": chart.name,
                "chart_type": QINGBI_CHART_TYPE_MAP[chart.chart_type],
                "preserve_portal_query_conditions": bool(chart.config.get("preserve_portal_query_conditions", False)),
                "create_payload": {
                    "chartId": "__BI_CHART_ID__",
                    "chartName": chart.name,
                    "chartType": QINGBI_CHART_TYPE_MAP[chart.chart_type],
                    "dataSourceType": "qingflow",
                    "tagId": "0",
                    "parentId": "0",
                    "dataSourceId": "__APP_KEY__",
                    "visibleAuth": qingbi_workspace_visible_auth(),
                    "editAuthList": [],
                    "editAuthType": "ws",
                    "editAuthIncludeSubDept": True,
                },
                "config_payload": {
                    "chartName": chart.name,
                    "chartType": QINGBI_CHART_TYPE_MAP[chart.chart_type],
                    "selectedDimensionFieldIds": list(chart.dimension_field_ids),
                    "selectedMetricFieldIds": list(chart.indicator_field_ids),
                    "aggregate": aggregate,
                    "beforeAggregationFilterMatrix": list(chart.filters),
                    "afterAggregationFilterMatrix": after_filters,
                    "queryConditionFieldIds": query_condition_field_ids,
                    "queryConditionStatus": query_condition_status,
                    "queryConditionExact": query_condition_exact,
                    "displayLimitConfig": config.pop("displayLimitConfig", {"status": 1, "type": "asc", "limit": 20}),
                    "rawDataConfigDTO": config.pop(
                        "rawDataConfigDTO",
                        {
                            "beingOpen": False,
                            "authInfo": qingbi_workspace_visible_auth(),
                            "fieldInfoList": [],
                        },
                    ),
                    **config,
                },
                "ordinal": ordinal,
            }
        )
    return plans
