use serde::{Deserialize, Serialize};

use crate::{TKwotowy, TZnakowy};

/// Obciążenie lub odliczenie (Obciazenia/Odliczenia).
///
/// Pozycja obciążenia doliczanego do P_15 lub odliczenia odejmowanego od P_15.
/// maxOccurs="100".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ObciazenieOdliczenie {
    /// Kwota obciążenia/odliczenia (Kwota).
    ///
    /// Kwota doliczona do / odliczona od kwoty wykazanej w polu P_15.
    pub kwota: TKwotowy,
    /// Powód obciążenia/odliczenia (Powod).
    pub powod: TZnakowy,
}

/// Dodatkowe rozliczenia na fakturze (Rozliczenie).
///
/// Sekcja Fa/Rozliczenie. minOccurs="0".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Rozliczenie {
    /// Obciążenia (Obciazenia).
    ///
    /// maxOccurs="100". minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub obciazenia: Option<Vec<ObciazenieOdliczenie>>,
    /// Suma obciążeń (SumaObciazen).
    ///
    /// minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub suma_obciazen: Option<TKwotowy>,
    /// Odliczenia (Odliczenia).
    ///
    /// maxOccurs="100". minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub odliczenia: Option<Vec<ObciazenieOdliczenie>>,
    /// Suma odliczeń (SumaOdliczen).
    ///
    /// minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub suma_odliczen: Option<TKwotowy>,
    /// Kwota należności do zapłaty (DoZaplaty).
    ///
    /// Kwota należności do zapłaty równa polu P_15 powiększonemu o Obciazenia
    /// i pomniejszonemu o Odliczenia. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub do_zaplaty: Option<TKwotowy>,
    /// Kwota nadpłacona do rozliczenia/zwrotu (DoRozliczenia).
    ///
    /// minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub do_rozliczenia: Option<TKwotowy>,
}
