from __future__ import annotations

import logging
from collections.abc import Mapping
from typing import Any

from .section_builders import PayloadSectionBuildersMixin

logger = logging.getLogger("dscons.generation_payload.assembler")


class PayloadAssemblerMixin(PayloadSectionBuildersMixin):
    """Main assembly pipeline for site handover payload."""

    def assemble(
        self,
        source_data: Mapping[str, Any],
    ) -> BienBanBanGiaoMatBangGenerationPayload:
        """Tạo payload hoàn chỉnh, gắn template active, field statuses và readiness."""
        template = self._require_active_template()
        project_name = self._pick_first_str(
            source_data,
            "project_name",
            "project.project_name",
            "project.name",
            "project_info.project_name",
        )
        dossier_code = self._pick_first_str(
            source_data,
            "dossier_code",
            "document_number",
            "project.project_code",
            "project.code",
        )
        handover_date_text = self._pick_first_str(
            source_data,
            "handover_date_text",
            "handover.date_text",
            "handover.date",
            "meeting_date_text",
        )
        handover_location = self._pick_first_str(
            source_data,
            "handover_location",
            "handover.location",
            "site.location",
            "location",
        )
        site_description = self._pick_first_str(
            source_data,
            "site_description",
            "handover_scope_summary",
            "handover.scope_summary",
            "site.description",
            "site_name",
        )

        handing_over_organization = self._build_organization_info(
            source_data,
            primary_path="handing_over_organization",
            fallback_paths=(
                "transferor_organization",
                "transferor_org",
                "investor",
                "project.investor",
            ),
            default_name=self._pick_first_str(
                source_data,
                "transferor_org_name",
                "investor_name",
                "project.investor_name",
            ),
            default_address=self._pick_first_str(
                source_data,
                "transferor_org_address",
                "investor_address",
                "project.investor_address",
            ),
            default_representative_name=self._pick_first_str(
                source_data,
                "transferor_signatory_full_name",
                "handing_over_signatory.full_name",
            ),
            default_representative_title=self._pick_first_str(
                source_data,
                "transferor_signatory_title",
                "handing_over_signatory.title",
            ),
        )
        receiving_organization = self._build_organization_info(
            source_data,
            primary_path="receiving_organization",
            fallback_paths=(
                "recipient_organization",
                "recipient_org",
                "contract.contractor",
                "contractor",
            ),
            default_name=self._pick_first_str(
                source_data,
                "recipient_org_name",
                "contract.contractor.name",
                "contractor_name",
            ),
            default_address=self._pick_first_str(
                source_data,
                "recipient_org_address",
                "contract.contractor.address",
                "contractor_address",
            ),
            default_representative_name=self._pick_first_str(
                source_data,
                "recipient_signatory_full_name",
                "receiving_signatory.full_name",
            ),
            default_representative_title=self._pick_first_str(
                source_data,
                "recipient_signatory_title",
                "receiving_signatory.title",
            ),
        )

        handing_over_signatory = self._build_signatory_info(
            source_data,
            primary_path="handing_over_signatory",
            fallback_paths=("transferor_signatory",),
            default_full_name=self._pick_first_str(
                source_data,
                "transferor_signatory_full_name",
                "handing_over_organization.representative_name",
            ),
            default_title=self._pick_first_str(
                source_data,
                "transferor_signatory_title",
                "handing_over_organization.representative_title",
            ),
            organization=handing_over_organization,
            default_signing_place=handover_location,
            default_signing_date_text=handover_date_text,
        )
        receiving_signatory = self._build_signatory_info(
            source_data,
            primary_path="receiving_signatory",
            fallback_paths=("recipient_signatory",),
            default_full_name=self._pick_first_str(
                source_data,
                "recipient_signatory_full_name",
                "receiving_organization.representative_name",
            ),
            default_title=self._pick_first_str(
                source_data,
                "recipient_signatory_title",
                "receiving_organization.representative_title",
            ),
            organization=receiving_organization,
            default_signing_place=handover_location,
            default_signing_date_text=handover_date_text,
        )

        extra_context = self._build_extra_context(
            source_data=source_data,
            template=template,
            project_name=project_name,
            dossier_code=dossier_code,
            handover_date_text=handover_date_text,
            handover_location=handover_location,
            site_description=site_description,
        )

        placeholder_payload = BienBanBanGiaoMatBangGenerationPayload(
            template=template,
            project_name=project_name,
            dossier_code=dossier_code,
            handover_date_text=handover_date_text,
            handover_location=handover_location,
            site_description=site_description,
            receiving_organization=receiving_organization,
            handing_over_organization=handing_over_organization,
            receiving_signatory=receiving_signatory,
            handing_over_signatory=handing_over_signatory,
            field_statuses=[],
            readiness=self._build_initial_readiness(),
            review_workflow=self._build_default_review_workflow(),
            extra_context=extra_context,
        )

        field_statuses, readiness = (
            self._readiness_service.build_generation_payload_status(placeholder_payload)
        )

        return placeholder_payload.model_copy(
            update={
                "field_statuses": field_statuses,
                "readiness": readiness,
            }
        )
