"""A background describing the T₁ decay of a two-level system."""
@kwdef struct T1Decay <: AbstractBackground
    "The T₁ time of the two-level system."
    t1::Float64 = 1e9 # TODO consider parameterizing the type
end

"""A background describing the T₂ dephasing of a two-level system."""
@kwdef struct T2Dephasing <: AbstractBackground
    "The T₂ time of the two-level system."
    t2::Float64 = 1e9 # TODO consider parameterizing the type
end

"""A depolarization background.

The `τ` parameter specifies the average time between depolarization events (assuming a Poisson point process).
I.e. after time `t` the probability for an depolarization event is `1-exp(-t/τ)`.
"""
@kwdef struct Depolarization <: AbstractBackground
    "The average time between depolarization events (assuming a Poisson point process)."
    τ::Float64 = 1e9 # TODO consider parameterizing the type
end

"""A Pauli noise background."""
@kwdef struct PauliNoise <: AbstractBackground
    "The average time between X noise events (assuming a Poisson point process)."
    τˣ::Float64 = 1e9 # TODO consider parameterizing the type
    "The average time between Y noise events (assuming a Poisson point process)."
    τʸ::Float64 = 1e9
    "The average time between Z noise events (assuming a Poisson point process)."
    τᶻ::Float64 = 1e9
end

"""A depolarization background."""
@kwdef struct AmplitudeDamping <: AbstractBackground
    "The characteristic time of the amplitude damping process."
    τ::Float64 = 1e9 # TODO consider parameterizing the type
end

"""A background combining both T₁ decay and T₂ dephasing."""
@kwdef struct T1T2Noise <: AbstractBackground
    "The T₁ time of the two-level system."
    t1::Float64 = 1e9
    "The T₂ time of the two-level system."
    t2::Float64 = 1e9
end

# TODO
# T1TwirledDecay
# T1T2TwirledNoise

"""Display all available background types in QuantumSavory along with their documentation.

The `InteractiveUtils` package must be installed and imported."""
function available_background_types end
