use serde::{Deserialize, Serialize};

use crate::{TProcentowy, TRolaPodmiotu3, TZnakowy, TZnakowy20};

use super::common::{DaneIdentyfikacyjnePodmiot3, DaneKontaktowe, TAdres};

/// Dane podmiotu trzeciego (Podmiot3).
///
/// Dane podmiotu/-ów trzeciego/-ich (innego/-ych niż sprzedawca i nabywca
/// wymieniony w części Podmiot2), związanego/-ych z fakturą.
/// minOccurs="0", maxOccurs="100".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Podmiot3Info {
    /// Unikalny klucz powiązania danych nabywcy (IDNabywcy).
    ///
    /// Unikalny klucz powiązania danych nabywcy na fakturach korygujących,
    /// w przypadku gdy dane nabywcy na fakturze korygującej zmieniły się
    /// w stosunku do danych na fakturze korygowanej.
    /// minOccurs="0". maxLength="32".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub id_nabywcy: Option<TZnakowy>,
    /// Numer EORI podmiotu trzeciego (NrEORI).
    ///
    /// minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub nr_eori: Option<TZnakowy20>,
    /// Dane identyfikujące podmiot trzeci (DaneIdentyfikacyjne).
    ///
    /// Typ TPodmiot3.
    pub dane_identyfikacyjne: DaneIdentyfikacyjnePodmiot3,
    /// Adres podmiotu trzeciego (Adres).
    ///
    /// Typ TAdres. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub adres: Option<TAdres>,
    /// Adres korespondencyjny podmiotu trzeciego (AdresKoresp).
    ///
    /// Typ TAdres. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub adres_koresp: Option<TAdres>,
    /// Dane kontaktowe podmiotu trzeciego (DaneKontaktowe).
    ///
    /// minOccurs="0", maxOccurs="3".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub dane_kontaktowe: Option<Vec<DaneKontaktowe>>,
    /// Rola podmiotu (Rola).
    ///
    /// Rola podmiotu trzeciego (TRolaPodmiotu3).
    /// Używane alternatywnie z rola_inna + opis_roli.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub rola: Option<TRolaPodmiotu3>,
    /// Znacznik innego podmiotu (RolaInna).
    ///
    /// Znacznik innego podmiotu: 1 - Inny podmiot. TWybor1.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub rola_inna: Option<TZnakowy>,
    /// Opis roli podmiotu (OpisRoli).
    ///
    /// Opis roli podmiotu - w przypadku wyboru roli jako Inny podmiot.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub opis_roli: Option<TZnakowy>,
    /// Udział procentowy (Udzial).
    ///
    /// Procentowy udział dodatkowego nabywcy. Różnica pomiędzy wartością 100%
    /// a sumą udziałów dodatkowych nabywców jest udziałem nabywcy wymienionego
    /// w części Podmiot2. W przypadku niewypełnienia pola przyjmuje się,
    /// że udziały występujących na fakturze nabywców są równe.
    /// minOccurs="0". TProcentowy.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub udzial: Option<TProcentowy>,
    /// Numer klienta (NrKlienta).
    ///
    /// Numer klienta dla przypadków, w których podmiot wymieniony jako podmiot
    /// trzeci posługuje się nim w umowie lub zamówieniu. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub nr_klienta: Option<TZnakowy>,
}
