use serde::{Deserialize, Serialize};

use crate::{TKwotowy2, TNaturalny, TZnakowy};

/// Nowy środek transportu (NowySrodekTransportu).
///
/// Dane dotyczące nowego środka transportu w ramach wewnątrzwspólnotowej dostawy.
/// maxOccurs="10000".
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct NowySrodekTransportu {
    /// Data dopuszczenia nowego środka transportu do użytku (P_22A).
    ///
    /// TDataT.
    pub p_22a: u8,
    /// Numer wiersza faktury z dostawą nowego środka transportu (P_NrWierszaNST).
    ///
    /// Numer wiersza faktury, w którym wykazano dostawę nowego środka transportu.
    pub p_nr_wiersza_nst: TNaturalny,
    /// Marka nowego środka transportu (P_22BMK).
    ///
    /// minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22b_mk: Option<TZnakowy>,
    /// Model nowego środka transportu (P_22BMD).
    ///
    /// minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22b_md: Option<TZnakowy>,
    /// Kolor nowego środka transportu (P_22BK).
    ///
    /// minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22b_k: Option<TZnakowy>,
    /// Numer rejestracyjny nowego środka transportu (P_22BNR).
    ///
    /// minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22b_nr: Option<TZnakowy>,
    /// Rok produkcji nowego środka transportu (P_22BRP).
    ///
    /// minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22b_rp: Option<TZnakowy>,
    /// Przebieg pojazdu lądowego (P_22B).
    ///
    /// Jeśli dostawa dotyczy pojazdów lądowych, o których mowa w art. 2 pkt 10 lit. a ustawy,
    /// należy podać przebieg pojazdu. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22b: Option<TKwotowy2>,
    /// Numer VIN pojazdu lądowego (P_22B1).
    ///
    /// Jeśli dostawa dotyczy pojazdów lądowych - numer VIN. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22b1: Option<TKwotowy2>,
    /// Numer nadwozia pojazdu lądowego (P_22B2).
    ///
    /// Jeśli dostawa dotyczy pojazdów lądowych - numer nadwozia. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22b2: Option<TKwotowy2>,
    /// Numer podwozia pojazdu lądowego (P_22B3).
    ///
    /// Jeśli dostawa dotyczy pojazdów lądowych - numer podwozia. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22b3: Option<TKwotowy2>,
    /// Numer ramy pojazdu lądowego (P_22B4).
    ///
    /// Jeśli dostawa dotyczy pojazdów lądowych - numer ramy. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22b4: Option<TKwotowy2>,
    /// Typ nowego środka transportu lądowego (P_22BT).
    ///
    /// Jeśli dostawa dotyczy pojazdów lądowych - typ nowego środka transportu. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22bt: Option<TKwotowy2>,
    /// Liczba godzin roboczych jednostki pływającej (P_22C).
    ///
    /// Jeśli dostawa dotyczy jednostek pływających, o których mowa w art. 2 pkt 10 lit. b ustawy,
    /// należy podać liczbę godzin roboczych używania nowego środka transportu. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22c: Option<TKwotowy2>,
    /// Numer kadłuba jednostki pływającej (P_22C1).
    ///
    /// Jeśli dostawa dotyczy jednostek pływających - numer kadłuba. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22c1: Option<TKwotowy2>,
    /// Liczba godzin roboczych statku powietrznego (P_22D).
    ///
    /// Jeśli dostawa dotyczy statków powietrznych, o których mowa w art. 2 pkt 10 lit. c ustawy,
    /// należy podać liczbę godzin roboczych używania nowego środka transportu. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22d: Option<TKwotowy2>,
    /// Numer fabryczny statku powietrznego (P_22D1).
    ///
    /// Jeśli dostawa dotyczy statków powietrznych - numer fabryczny. minOccurs="0".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22d1: Option<TKwotowy2>,
}

/// Sekcja zwolnienia od podatku (Zwolnienie).
///
/// Część sekcji Adnotacje dotycząca zwolnień od podatku.
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Zwolnienie {
    /// Znacznik dostawy towarów/usług zwolnionych od podatku (P_19).
    ///
    /// Znacznik dostawy towarów lub świadczenia usług zwolnionych od podatku
    /// na podstawie art. 43 ust. 1 ustawy, art. 113 ust. 1 i 9 ustawy
    /// albo przepisów wydanych na podstawie art. 82 ust. 3 ustawy
    /// lub na podstawie innych przepisów. TWybor1.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_19: Option<u8>,
    /// Przepis ustawy będący podstawą zwolnienia (P_19A).
    ///
    /// Jeśli pole P_19 równa się "1" - należy wskazać przepis ustawy albo aktu
    /// wydanego na podstawie ustawy, na podstawie którego podatnik stosuje
    /// zwolnienie od podatku.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_19a: Option<TZnakowy>,
    /// Przepis dyrektywy 2006/112/WE (P_19B).
    ///
    /// Jeśli pole P_19 równa się "1" - należy wskazać przepis dyrektywy
    /// 2006/112/WE, który zwalnia od podatku taką dostawę towarów
    /// lub takie świadczenie usług.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_19b: Option<TZnakowy>,
    /// Inna podstawa prawna zwolnienia (P_19C).
    ///
    /// Jeśli pole P_19 równa się "1" - należy wskazać inną podstawę prawną
    /// wskazującą na to, że dostawa towarów lub świadczenie usług korzysta
    /// ze zwolnienia od podatku.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_19c: Option<TZnakowy>,
    /// Znacznik braku zwolnienia od podatku (P_19N).
    ///
    /// Znacznik braku dostawy towarów lub świadczenia usług zwolnionych od podatku
    /// na podstawie art. 43 ust. 1, art. 113 ust. 1 i 9 ustawy albo przepisów
    /// wydanych na podstawie art. 82 ust. 3 ustawy lub innych przepisów.
    /// TWybor1.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_19n: Option<u8>,
}

/// Sekcja nowych środków transportu (NoweSrodkiTransportu).
///
/// Część sekcji Adnotacje dotycząca wewnątrzwspólnotowej dostawy
/// nowych środków transportu.
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct NoweSrodkiTransportu {
    /// Znacznik wewnątrzwspólnotowej dostawy nowych środków transportu (P_22).
    ///
    /// TWybor1.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22: Option<u8>,
    /// Obowiązek z art. 42 ust. 5 ustawy (P_42_5).
    ///
    /// Jeśli występuje obowiązek, o którym mowa w art. 42 ust. 5 ustawy,
    /// należy podać wartość "1", w przeciwnym przypadku - wartość "2".
    /// TWybor1_2.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_42_5: Option<u8>,
    /// Dane nowych środków transportu (NowySrodekTransportu).
    ///
    /// maxOccurs="10000".
    #[serde(skip_serializing_if = "Option::is_none")]
    pub nowy_srodek_transportu: Option<Vec<NowySrodekTransportu>>,
    /// Znacznik braku wewnątrzwspólnotowej dostawy nowych środków transportu (P_22N).
    ///
    /// TWybor1.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_22n: Option<u8>,
}

/// Sekcja procedur marży (PMarzy).
///
/// Część sekcji Adnotacje dotycząca procedur marży, o których mowa
/// w art. 119 lub art. 120 ustawy.
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PMarzy {
    /// Znacznik wystąpienia procedur marży (P_PMarzy).
    ///
    /// Znacznik wystąpienia procedur marży, o których mowa w art. 119
    /// lub art. 120 ustawy. TWybor1.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_p_marzy: Option<u8>,
    /// Znacznik usług turystyki z marżą (P_PMarzy_2).
    ///
    /// Znacznik świadczenia usług turystyki, dla których podstawę opodatkowania
    /// stanowi marża, zgodnie z art. 119 ust. 1 ustawy - "procedura marży
    /// dla biur podróży". TWybor1.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_p_marzy_2: Option<TZnakowy>,
    /// Znacznik dostawy towarów używanych z marżą (P_PMarzy_3_1).
    ///
    /// Znacznik dostawy towarów używanych z marżą zgodnie z art. 120 ustawy -
    /// "procedura marży - towary używane". TWybor1.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_p_marzy_3_1: Option<u8>,
    /// Znacznik dostawy dzieł sztuki z marżą (P_PMarzy_3_2).
    ///
    /// Znacznik dostawy dzieł sztuki z marżą zgodnie z art. 120 ustawy -
    /// "procedura marży - dzieła sztuki". TWybor1.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_p_marzy_3_2: Option<u8>,
    /// Znacznik dostawy przedmiotów kolekcjonerskich i antyków z marżą (P_PMarzy_3_3).
    ///
    /// Znacznik dostawy przedmiotów kolekcjonerskich i antyków z marżą
    /// zgodnie z art. 120 ustawy - "procedura marży - przedmioty kolekcjonerskie
    /// i antyki". TWybor1.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_p_marzy_3_3: Option<u8>,
    /// Znacznik braku procedur marży (P_PMarzyN).
    ///
    /// Znacznik braku wystąpienia procedur marży, o których mowa w art. 119
    /// lub art. 120 ustawy. TWybor1.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub p_p_marzy_n: Option<u8>,
}

/// Inne adnotacje na fakturze (Adnotacje).
///
/// Sekcja Fa/Adnotacje zawierająca informacje o odwrotnym obciążeniu,
/// samofakturowaniu, mechanizmie podzielonej płatności, metodzie kasowej,
/// zwolnieniach, nowych środkach transportu, procedurze uproszczonej
/// i procedurach marży.
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Adnotacje {
    /// Metoda kasowa (P_16).
    ///
    /// W przypadku dostawy towarów lub świadczenia usług, w odniesieniu do których
    /// obowiązek podatkowy powstaje zgodnie z art. 19a ust. 5 pkt 1 lub art. 21 ust. 1 ustawy -
    /// wyrazy "metoda kasowa"; wartość "1" = tak, "2" = nie. TWybor1_2.
    pub p_16: u8,
    /// Samofakturowanie (P_17).
    ///
    /// W przypadku faktur, o których mowa w art. 106d ust. 1 ustawy -
    /// wyraz "samofakturowanie"; wartość "1" = tak, "2" = nie. TWybor1_2.
    pub p_17: u8,
    /// Odwrotne obciążenie (P_18).
    ///
    /// W przypadku dostawy towarów lub wykonania usługi, dla których obowiązanym
    /// do rozliczenia podatku od wartości dodanej lub podatku o podobnym charakterze
    /// jest nabywca towaru lub usługi - wyrazy "odwrotne obciążenie";
    /// wartość "1" = tak, "2" = nie. TWybor1_2.
    pub p_18: u8,
    /// Mechanizm podzielonej płatności (P_18A).
    ///
    /// W przypadku faktur, w których kwota należności ogółem przekracza kwotę 15 000 zł
    /// lub jej równowartość wyrażoną w walucie obcej, obejmujących dokonaną na rzecz
    /// podatnika dostawę towarów lub świadczenie usług, o których mowa w załączniku
    /// nr 15 do ustawy - wyrazy "mechanizm podzielonej płatności";
    /// wartość "1" = tak, "2" = nie. TWybor1_2.
    pub p_18a: u8,
    /// Sekcja zwolnienia od podatku (Zwolnienie).
    pub zwolnienie: Zwolnienie,
    /// Sekcja nowych środków transportu (NoweSrodkiTransportu).
    pub nowe_srodki_transportu: NoweSrodkiTransportu,
    /// Procedura uproszczona trójstronna (P_23).
    ///
    /// W przypadku faktur wystawianych w procedurze uproszczonej przez drugiego
    /// w kolejności podatnika, o którym mowa w art. 135 ust. 1 pkt 4 lit. b i c
    /// oraz ust. 2 ustawy, zawierającej adnotację, o której mowa w art. 136 ust. 1
    /// pkt 1 ustawy i stwierdzenie z art. 136 ust. 1 pkt 2 ustawy;
    /// wartość "1" = tak, "2" = nie. TWybor1_2.
    pub p_23: u8,
    /// Sekcja procedur marży (PMarzy).
    pub p_marzy: PMarzy,
}
