use serde::{Deserialize, Serialize};

use crate::{
    TIlosci, TKwotowy, TKwotowy2, TNaturalny, TProcentowy, TStawkaPodatku, TZnakowy, TGTU,
};

/// Wiersz zamówienia lub umowy (ZamowienieWiersz).
///
/// Szczegółowe pozycje zamówienia lub umowy w walucie, w której wystawiono
/// fakturę zaliczkową. maxOccurs="10000".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ZamowienieWiersz {
    /// Kolejny numer wiersza zamówienia lub umowy (NrWierszaZam).
    pub nr_wiersza_zam: TNaturalny,
    /// Uniwersalny unikalny numer wiersza zamówienia lub umowy (UU_IDZ).
    ///
    /// TZnakowy50. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub uu_idz: Option<TZnakowy>,
    /// Nazwa (rodzaj) towaru lub usługi (P_7Z).
    ///
    /// TZnakowy512. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_7z: Option<TZnakowy>,
    /// Wewnętrzny kod towaru lub usługi lub dodatkowy opis (IndeksZ).
    ///
    /// TZnakowy50. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub indeks_z: Option<TZnakowy>,
    /// Globalny numer jednostki handlowej (GTINZ).
    ///
    /// TZnakowy20. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub gtin_z: Option<TZnakowy>,
    /// Symbol Polskiej Klasyfikacji Wyrobów i Usług (PKWiUZ).
    ///
    /// TZnakowy50. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub pkwi_uz: Option<TZnakowy>,
    /// Symbol Nomenklatury Scalonej (CNZ).
    ///
    /// TZnakowy50. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub cn_z: Option<TZnakowy>,
    /// Symbol Polskiej Klasyfikacji Obiektów Budowlanych (PKOBZ).
    ///
    /// TZnakowy50. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub pkob_z: Option<TZnakowy>,
    /// Miara zamówionego towaru lub zakres usługi (P_8AZ).
    ///
    /// minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_8az: Option<TZnakowy>,
    /// Ilość zamówionego towaru lub zakres usługi (P_8BZ).
    ///
    /// TIlosci. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_8bz: Option<TIlosci>,
    /// Cena jednostkowa netto (P_9AZ).
    ///
    /// TKwotowy2. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_9az: Option<TKwotowy2>,
    /// Wartość zamówionego towaru lub usługi bez kwoty podatku (P_11NettoZ).
    ///
    /// TKwotowy. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_11_netto_z: Option<TKwotowy>,
    /// Kwota podatku od zamówionego towaru lub usługi (P_11VatZ).
    ///
    /// TKwotowy. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_11_vat_z: Option<TKwotowy>,
    /// Stawka podatku (P_12Z).
    ///
    /// TStawkaPodatku. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_12z: Option<TStawkaPodatku>,
    /// Stawka podatku od wartości dodanej - dział XII rozdział 6a (P_12Z_XII).
    ///
    /// TProcentowy. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_12z_xii: Option<TProcentowy>,
    /// Znacznik towaru/usługi z załącznika nr 15 (P_12Z_Zal_15).
    ///
    /// Znacznik dla towaru lub usługi wymienionych w załączniku nr 15
    /// do ustawy - wartość "1". TWybor1. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_12z_zal_15: Option<TProcentowy>,
    /// Oznaczenie GTU (GTUZ).
    ///
    /// Oznaczenie dotyczące dostawy towarów i świadczenia usług.
    /// TGTU. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub gtu_z: Option<TGTU>,
    /// Oznaczenie procedury (ProceduraZ).
    ///
    /// Oznaczenia dotyczące procedur. TOznaczenieProceduryZ. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub procedura_z: Option<TZnakowy>,
    /// Kwota podatku akcyzowego (KwotaAkcyzyZ).
    ///
    /// Kwota podatku akcyzowego zawarta w cenie towaru. TKwotowy. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub kwota_akcyzy_z: Option<TKwotowy>,
    /// Znacznik stanu przed korektą zamówienia (StanPrzedZ).
    ///
    /// Znacznik stanu przed korektą w przypadku faktury korygującej fakturę
    /// zaliczkową, gdy korekta dotyczy danych wykazanych w pozycjach zamówienia.
    /// TWybor1. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub stan_przed_z: Option<u8>,
}

/// Zamówienie lub umowa (Zamowienie).
///
/// Zamówienie lub umowa, o których mowa w art. 106f ust. 1 pkt 4 ustawy
/// (dla faktur zaliczkowych), w walucie, w której wystawiono fakturę
/// zaliczkową. Sekcja Fa/Zamowienie. minOccurs="0".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ZamowienieData {
    /// Wartość zamówienia lub umowy z uwzględnieniem kwoty podatku (WartoscZamowienia).
    pub wartosc_zamowienia: TKwotowy,
    /// Szczegółowe pozycje zamówienia lub umowy (ZamowienieWiersz).
    ///
    /// maxOccurs="10000".
    pub zamowienie_wiersz: Vec<ZamowienieWiersz>,
}
