use serde::{Deserialize, Serialize};

use crate::{
    TKodKraju, TKodyKrajowUE, TNIPIdWew, TNrVatUE, TNumerTelefonu, TZnakowy, TZnakowy50, TGLN,
};

/// Simplified party (seller / buyer) input used by MCP and batch endpoints.
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct PartyInput {
    /// Tax identification number (NIP).
    pub nip: String,
    /// Legal or trade name of the party.
    pub name: String,
    /// Address line 1 or full free-form address.
    pub address: Option<String>,
    /// Address line 2 (typically postal code and city).
    #[serde(rename = "addressL2", default)]
    pub address_l2: Option<String>,
    /// KRS number (optional).
    #[serde(default)]
    pub krs: Option<String>,
    /// REGON number (optional).
    #[serde(default)]
    pub regon: Option<String>,
}

/// Simplified Podmiot3 (third-party) input used by MCP and batch endpoints.
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Podmiot3Input {
    /// Optional NIP for Podmiot3.
    #[serde(default)]
    pub nip: Option<String>,
    /// Name of Podmiot3.
    pub name: String,
    /// Optional address of Podmiot3.
    #[serde(default)]
    pub address: Option<String>,
    /// Podmiot3 role code.
    pub role: u8,
}

/// Dane kontaktowe (DaneKontaktowe).
///
/// Dane kontaktowe podmiotu. maxOccurs="3".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DaneKontaktowe {
    /// Adres e-mail (Email).
    ///
    /// Adres poczty elektronicznej. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub email: Option<String>,
    /// Numer telefonu (Telefon).
    ///
    /// Numer telefonu podmiotu. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub telefon: Option<TNumerTelefonu>,
}

/// Informacje opisujące adres (TAdres).
///
/// Typ złożony opisujący adres podmiotu na fakturze.
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TAdres {
    /// Kod Kraju (KodKraju).
    ///
    /// Kod Kraju [Country Code].
    #[serde(skip_serializing_if = "Option::is_none")]
    pub kod_kraju: Option<TKodyKrajowUE>,
    /// Adres - linia 1 (AdresL1).
    ///
    /// Adres [Address]. TZnakowy512.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub adres_l1: Option<TZnakowy>,
    /// Adres - linia 2 (AdresL2).
    ///
    /// Adres [Address]. minOccurs="0". TZnakowy512.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub adres_l2: Option<TZnakowy>,
    /// Kod pocztowy.
    ///
    /// Pole aplikacyjne, nie występuje w XSD FA(3).
    #[serde(skip_serializing_if = "Option::is_none")]
    pub kod_pocztowy: Option<TZnakowy>,
    /// Miejscowość.
    ///
    /// Pole aplikacyjne, nie występuje w XSD FA(3).
    #[serde(skip_serializing_if = "Option::is_none")]
    pub miejscowosc: Option<TZnakowy>,
    /// Globalny Numer Lokalizacyjny (GLN).
    ///
    /// Globalny Numer Lokalizacyjny [Global Location Number]. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub gln: Option<TGLN>,
}

/// Zestaw danych identyfikacyjnych podatnika - Podmiot1 (TPodmiot1).
///
/// Zestaw danych identyfikacyjnych oraz danych adresowych podatnika.
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DaneIdentyfikacyjnePodmiot1 {
    /// Identyfikator podatkowy NIP (NIP).
    pub nip: TNIPIdWew,
    /// Imię i nazwisko lub nazwa (Nazwa).
    ///
    /// TZnakowy512.
    pub nazwa: TZnakowy,
}

/// Zestaw danych identyfikacyjnych nabywcy - Podmiot2 (TPodmiot2).
///
/// Zestaw danych identyfikacyjnych oraz danych adresowych nabywcy.
/// Numer, za pomocą którego nabywca towarów lub usług jest zidentyfikowany
/// na potrzeby podatku lub podatku od wartości dodanej.
/// Pole opcjonalne dla przypadku określonego w art. 106e ust. 5 pkt 2 ustawy.
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DaneIdentyfikacyjnePodmiot2 {
    /// Identyfikator podatkowy NIP (NIP).
    #[serde(skip_serializing_if = "Option::is_none")]
    pub nip: Option<TNIPIdWew>,
    /// Kod (prefiks) nabywcy VAT UE (KodUE).
    ///
    /// Kod (prefiks) nabywcy VAT UE, o którym mowa w art. 106e ust. 1 pkt 24 ustawy
    /// oraz w przypadku, o którym mowa w art. 136 ust. 1 pkt 4 ustawy.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub kod_ue: Option<TKodyKrajowUE>,
    /// Numer Identyfikacyjny VAT kontrahenta UE (NrVatUE).
    #[serde(skip_serializing_if = "Option::is_none")]
    pub nr_vat_ue: Option<TNrVatUE>,
    /// Kod kraju nadania identyfikatora podatkowego (KodKraju).
    ///
    /// minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub kod_kraju: Option<TKodKraju>,
    /// Identyfikator podatkowy inny (NrID).
    #[serde(skip_serializing_if = "Option::is_none")]
    pub nr_id: Option<TZnakowy50>,
    /// Podmiot nie posiada identyfikatora podatkowego (BrakID).
    ///
    /// Podmiot nie posiada identyfikatora podatkowego lub identyfikator
    /// nie występuje na fakturze: 1 - tak.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub brak_id: Option<u8>,
    /// Imię i nazwisko lub nazwa (Nazwa).
    ///
    /// Dane opcjonalne dla przypadków, o których mowa w art. 106e ust. 5 pkt 3 ustawy.
    /// TZnakowy512. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub nazwa: Option<TZnakowy>,
}

/// Zestaw danych identyfikacyjnych podmiotu trzeciego - Podmiot3 (TPodmiot3).
///
/// Zestaw danych identyfikacyjnych oraz danych adresowych podmiotów trzecich.
/// Struktura identyczna z TPodmiot2 - numer identyfikacyjny w jednym z wariantów:
/// NIP, IDWew, KodUE+NrVatUE, KodKraju+NrID, BrakID.
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DaneIdentyfikacyjnePodmiot3 {
    /// Identyfikator podatkowy NIP (NIP).
    #[serde(skip_serializing_if = "Option::is_none")]
    pub nip: Option<TNIPIdWew>,
    /// Kod (prefiks) nabywcy VAT UE (KodUE).
    ///
    /// Kod (prefiks) nabywcy VAT UE, o którym mowa w art. 106e ust. 1 pkt 24 ustawy
    /// oraz w przypadku, o którym mowa w art. 136 ust. 1 pkt 4 ustawy.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub kod_ue: Option<TKodyKrajowUE>,
    /// Numer Identyfikacyjny VAT kontrahenta UE (NrVatUE).
    #[serde(skip_serializing_if = "Option::is_none")]
    pub nr_vat_ue: Option<TNrVatUE>,
    /// Kod kraju nadania identyfikatora podatkowego (KodKraju).
    ///
    /// minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub kod_kraju: Option<TKodKraju>,
    /// Identyfikator podatkowy inny (NrID).
    #[serde(skip_serializing_if = "Option::is_none")]
    pub nr_id: Option<TZnakowy50>,
    /// Podmiot nie posiada identyfikatora podatkowego (BrakID).
    ///
    /// Podmiot nie posiada identyfikatora podatkowego lub identyfikator
    /// nie występuje na fakturze: 1 - tak.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub brak_id: Option<u8>,
    /// Imię i nazwisko lub nazwa (Nazwa).
    ///
    /// Dane opcjonalne dla przypadków, o których mowa w art. 106e ust. 5 pkt 3 ustawy.
    /// TZnakowy512. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub nazwa: Option<TZnakowy>,
}
