use serde::{Deserialize, Serialize};

use crate::TZnakowy;

/// Dane opisowe załącznika - klucz-wartość (MetaDane).
///
/// Dane opisowe. maxOccurs="1000".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ZalacznikMetaDane {
    /// Klucz (ZKlucz).
    pub z_klucz: TZnakowy,
    /// Wartość (ZWartosc).
    pub z_wartosc: TZnakowy,
}

/// Akapit tekstu załącznika (Akapit).
///
/// Opis. TZnakowy512. maxOccurs="10".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ZalacznikAkapit {
    /// Treść akapitu (Akapit).
    ///
    /// TZnakowy512.
    pub akapit: TZnakowy,
}

/// Dane opisowe dotyczące tabeli - klucz-wartość (TMetaDane).
///
/// Dane opisowe dotyczące tabeli. maxOccurs="1000".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TabelaMetaDane {
    /// Klucz (TKlucz).
    pub t_klucz: TZnakowy,
    /// Wartość (TWartosc).
    pub t_wartosc: TZnakowy,
}

/// Kolumna nagłówka tabeli (Kol).
///
/// Kolumna tabeli z atrybutem Typ. maxOccurs="20".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TabelaKolumna {
    /// Zawartość pola nagłówka (NKom).
    ///
    /// TZnakowy2.
    pub wartosc: TZnakowy,
    /// Typ kolumny (Typ).
    ///
    /// Dopuszczalne wartości: date, datetime, dec, int, time, txt.
    /// Atrybut wymagany (use="required").
    #[serde(skip_serializing_if = "Option::is_none")]
    pub typ: Option<TZnakowy>,
}

/// Wiersz tabeli (Wiersz).
///
/// Wiersze tabeli. maxOccurs="1000".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TabelaWiersz {
    /// Zawartość pól wiersza (WKom).
    ///
    /// TZnakowy2. maxOccurs="20".
    pub w_kom: Vec<TZnakowy>,
}

/// Podsumowanie tabeli (Suma).
///
/// Podsumowania tabeli. minOccurs="0".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TabelaSuma {
    /// Zawartość pól podsumowania (SKom).
    ///
    /// TZnakowy2. maxOccurs="20".
    pub s_kom: Vec<TZnakowy>,
}

/// Tabela załącznika (Tabela).
///
/// Tabele. maxOccurs="1000".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Tabela {
    /// Dane opisowe tabeli (TMetaDane).
    ///
    /// maxOccurs="1000". minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub t_meta_dane: Option<Vec<TabelaMetaDane>>,
    /// Opis tabeli (Opis).
    ///
    /// TZnakowy512. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub opis: Option<TZnakowy>,
    /// Nagłówek tabeli (TNaglowek).
    ///
    /// Kolumny nagłówka. maxOccurs="20".
    pub t_naglowek: Vec<TabelaKolumna>,
    /// Wiersze tabeli (Wiersz).
    ///
    /// maxOccurs="1000".
    pub wiersz: Vec<TabelaWiersz>,
    /// Podsumowanie tabeli (Suma).
    ///
    /// minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub suma: Option<TabelaSuma>,
}

/// Blok danych załącznika (BlokDanych).
///
/// Szczegółowe dane załącznika. maxOccurs="1000".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct BlokDanych {
    /// Nagłówek bloku danych (ZNaglowek).
    ///
    /// TZnakowy512. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub z_naglowek: Option<TZnakowy>,
    /// Dane opisowe (MetaDane).
    ///
    /// maxOccurs="1000".
    pub meta_dane: Vec<ZalacznikMetaDane>,
    /// Część tekstowa bloku danych (Tekst).
    ///
    /// minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tekst: Option<Vec<ZalacznikAkapit>>,
    /// Tabele (Tabela).
    ///
    /// maxOccurs="1000". minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tables: Option<Vec<Tabela>>,
}

/// Załącznik do faktury VAT (Zalacznik).
///
/// Sekcja Zalacznik. minOccurs="0".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Zalacznik {
    /// Bloki danych załącznika (BlokDanych).
    ///
    /// maxOccurs="1000".
    pub blok_danych: Vec<BlokDanych>,
}
