"""Ross1000 SOAP payload builder.

Composes a complete SOAP request payload for the Regione Liguria
checkinV2 endpoint by combining:
  1. The plain Ross1000 XML (from movement_serializer)
  2. The SOAP 1.1 envelope (from envelope_builder)

This module is the single entry point for SOAP payload construction.
It does NOT perform live HTTP transmission — that is the responsibility
of a future transport client.

Usage:
    from istat.ross1000.soap.payload_builder import build_ross1000_soap_payload

    soap_xml = build_ross1000_soap_payload(
        days=movement_days,
        structure_code="058091-CAV-00001",
        start_date=date(2026, 4, 1),
        end_date=date(2026, 4, 30),
        username="istat_user",
        password="istat_pass",
    )
"""

from __future__ import annotations

from datetime import date

from istat.ross1000.models.movement_payload import Ross1000MovementDayPayload
from istat.ross1000.soap.envelope_builder import build_soap_envelope
from istat.ross1000.xml.movement_serializer import serialize_movement_days_xml


def build_ross1000_soap_payload(
    days: list[Ross1000MovementDayPayload],
    *,
    structure_code: str,
    start_date: date,
    end_date: date,
    operation: str = "inviaMovimenti",
    username: str = "",
    password: str = "",
) -> str:
    """Build a complete SOAP 1.1 payload for the Ross1000 checkinV2 endpoint.

    Steps:
    1. Serialize movement days to plain UTF-8 XML
    2. Wrap in a SOAP 1.1 envelope with optional WS-Security credentials

    Args:
        days:           Movement day payloads (one per calendar day)
        structure_code: ISTAT structure code (e.g. "058091-CAV-00001")
        start_date:     First day of the reporting period
        end_date:       Last day of the reporting period
        operation:      WSDL operation name (default: "inviaMovimenti")
        username:       Optional ISTAT credential username for WS-Security header
        password:       Optional ISTAT credential password for WS-Security header

    Returns:
        UTF-8 SOAP envelope XML string ready for HTTP POST to:
        https://turismows.regione.liguria.it/ws/checkinV2?wsdl
    """
    xml_payload = serialize_movement_days_xml(
        days,
        structure_code=structure_code,
        start_date=start_date,
        end_date=end_date,
    )
    return build_soap_envelope(
        xml_payload,
        operation=operation,
        username=username,
        password=password,
    )
