use serde::{Deserialize, Serialize};

use crate::{TDataT, TIlosci, TKwotowy, TNaturalny, TNumerKSeF, TZnakowy};

/// Zaliczka częściowa (ZaliczkaCzesciowa).
///
/// Dane dla przypadków faktur dokumentujących otrzymanie więcej niż jednej
/// płatności, o której mowa w art. 106b ust. 1 pkt 4 ustawy.
/// W przypadku, gdy faktura, o której mowa w art. 106f ust. 3 ustawy
/// dokumentuje jednocześnie otrzymanie części zapłaty przed dokonaniem czynności,
/// różnica kwoty w polu P_15 i sumy poszczególnych pól P_15Z stanowi kwotę
/// pozostałą ponad płatności otrzymane przed wykonaniem czynności.
/// minOccurs="0", maxOccurs="31".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ZaliczkaCzesciowa {
    /// Data otrzymania płatności (P_6Z).
    ///
    /// Data otrzymania płatności, o której mowa w art. 106b ust. 1 pkt 4 ustawy.
    /// TDataT.
    pub p_6z: TDataT,
    /// Kwota płatności (P_15Z).
    ///
    /// Kwota płatności, o której mowa w art. 106b ust. 1 pkt 4 ustawy,
    /// składająca się na kwotę w polu P_15. W przypadku faktur korygujących -
    /// korekta kwoty wynikającej z faktury korygowanej. TKwotowy.
    pub p_15z: TKwotowy,
    /// Kurs waluty (KursWalutyZW).
    ///
    /// Kurs waluty stosowany do wyliczenia kwoty podatku w przypadkach,
    /// o których mowa w dziale VI ustawy. TIlosci. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub kurs_waluty_zw: Option<TIlosci>,
}

/// Referencja do faktury zaliczkowej (FakturaZaliczkowa).
///
/// Numery faktur zaliczkowych lub ich numery KSeF, jeśli zostały wystawione
/// z użyciem KSeF. minOccurs="0", maxOccurs="100".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct FakturaZaliczkowaRef {
    /// Znacznik faktury zaliczkowej wystawionej poza KSeF (NrKSeFZN).
    ///
    /// TWybor1. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub nr_ksef_zn: Option<TNumerKSeF>,
    /// Numer faktury zaliczkowej wystawionej poza KSeF (NrFaZaliczkowej).
    ///
    /// Pole obowiązkowe dla faktury wystawianej po wydaniu towaru lub wykonaniu
    /// usługi, o której mowa w art. 106f ust. 3 ustawy i ostatniej z faktur,
    /// o której mowa w art. 106f ust. 4 ustawy. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub nr_fa_zaliczkowej: Option<TZnakowy>,
    /// Numer identyfikujący fakturę zaliczkową w KSeF (NrKSeFFaZaliczkowej).
    ///
    /// Pole obowiązkowe w przypadku, gdy faktura zaliczkowa była wystawiona
    /// za pomocą KSeF. TNumerKSeF. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub nr_ksef_fa_zaliczkowej: Option<TNumerKSeF>,
}

/// Dodatkowy opis - klucz-wartość (DodatkowyOpis / TKluczWartosc).
///
/// Pola przeznaczone dla wykazywania dodatkowych danych na fakturze,
/// w tym wymaganych przepisami prawa, dla których nie przewidziano
/// innych pól/elementów. Typ złożony TKluczWartosc.
/// minOccurs="0", maxOccurs="10000".
///
/// Also serves as the canonical "additional description" type across the crate
/// (replaces BatchAdditionalDescription and ImportAdditionalDescription).
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Default, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DodatkowyOpis {
    /// Numer wiersza (NrWiersza).
    ///
    /// Numer wiersza podany w polu NrWierszaFa lub NrWierszaZam,
    /// jeśli informacja odnosi się wyłącznie do danej pozycji faktury.
    /// TNaturalny. minOccurs="0".
    #[serde(
        alias = "lineNumber",
        alias = "line_number",
        skip_serializing_if = "Option::is_none"
    )]
    pub nr_wiersza: Option<TNaturalny>,
    /// Klucz (Klucz).
    #[serde(alias = "key")]
    pub klucz: TZnakowy,
    /// Wartość (Wartosc).
    #[serde(alias = "value")]
    pub wartosc: TZnakowy,
}
