module io_metadata
  implicit none

  type :: variable_metadata
    character(len=32) :: name                       ! variable name
    character(len=32), dimension(4) :: dim_names    ! dimension names
    character(len=32) :: char_name(10) = ''    ! character metadata names
    character(len=32) :: char_value(10) = ''   ! character metadata values
    character(len=32) :: int_name(10) = ''     ! integer metadata names
    integer :: int_value(10) = 0               ! integer metadata values
    character(len=32) :: real_name(10) = ''    ! real metadata names
    real :: real_value(10) = 0.0               ! real metadata values
  end type variable_metadata

  ! variable metadata collection

  type(variable_metadata), public :: meta_temperature = variable_metadata( &
    name = 'T2M', &
    dim_names = [character(len=32) :: 'X', 'Y', 'Z', 'Time'], &
    char_name = [character(len=32) :: &
      'long_name', &
      'units', &
      '', '', '', '', '', '', '', ''], &
    char_value = [character(len=32) :: &
      'Air Temperature', &
      'C', &
      '', '', '', '', '', '', '', ''], &
    real_name = [character(len=32) :: &
      'missing_value', &
      'scale_factor', &
      '', '', '', '', '', '', '', ''], &
    real_value = [&
      -9999.9, &
      1.0, &
      0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])

  type(variable_metadata), public :: meta_pressure = variable_metadata( &
    name = 'SLP', &
    dim_names = [character(len=32) :: 'X', 'Y', 'Time', ''], &
    char_name = [character(len=32) :: &
      'long_name', &
      'units', &
      '', '', '', '', '', '', '', ''], &
    char_value = [character(len=32) :: &
      'Air Pressure at Sea Level', &
      'Pa', &
      '', '', '', '', '', '', '', ''], &
    real_name = [character(len=32) :: &
      'missing_value', &
      'scale_factor', &
      '', '', '', '', '', '', '', ''], &
    real_value = [&
      -9999.9, &
      1.0, &
      0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])

  type(variable_metadata), public :: meta_humidity = variable_metadata( &
    name = 'HUM_2M', &
    dim_names = [character(len=32) :: 'X', 'Y', 'Time', ''], &
    char_name = [character(len=32) :: &
      'long_name', &
      'units', &
      '', '', '', '', '', '', '', ''], &
    char_value = [character(len=32) :: &
      'Relative Humidity', &
      '%', &
      '', '', '', '', '', '', '', ''], &
    real_name = [character(len=32) :: &
      'missing_value', &
      'scale_factor', &
      '', '', '', '', '', '', '', ''], &
    real_value = [&
      -9999.9, &
      1.0, &
      0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])

  type(variable_metadata), public :: meta_richnum = variable_metadata( &
    name = 'RICHNUM', &
    dim_names = [character(len=32) :: 'X', 'Y', 'Z', 'Time'], &
    char_name = [character(len=32) :: &
      'long_name', &
      'units', &
      '', '', '', '', '', '', '', ''], &
    char_value = [character(len=32) :: &
      'Richardson number', &
      'Ri', &
      '', '', '', '', '', '', '', ''], &
    real_name = [character(len=32) :: &
      'missing_value', &
      'scale_factor', &
      '', '', '', '', '', '', '', ''], &
    real_value = [&
      -9999.9, &
      1.0, &
      0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])

  type(variable_metadata), public :: meta_anzt = variable_metadata( &
    name = 'ANZT', &
    dim_names = [character(len=32) :: 'X', 'Y', 'Z', 'Time'], &
    char_name = [character(len=32) :: &
      'long_name', &
      'units', &
      '', '', '', '', '', '', '', ''], &
    char_value = [character(len=32) :: &
      'ANZT Vertical mixing parameter', &
      'ANZT', &
      '', '', '', '', '', '', '', ''], &
    real_name = [character(len=32) :: &
      'missing_value', &
      'scale_factor', &
      '', '', '', '', '', '', '', ''], &
    real_value = [&
      -9999.9, &
      1.0, &
      0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])

  type(variable_metadata), public :: meta_anzu = variable_metadata( &
    name = 'ANZU', &
    dim_names = [character(len=32) :: 'X', 'Y', 'Z', 'Time'], &
    char_name = [character(len=32) :: &
      'long_name', &
      'units', &
      '', '', '', '', '', '', '', ''], &
    char_value = [character(len=32) :: &
      'ANZU Vertical mixing parameter', &
      'ANZU', &
      '', '', '', '', '', '', '', ''], &
    real_name = [character(len=32) :: &
      'missing_value', &
      'scale_factor', &
      '', '', '', '', '', '', '', ''], &
    real_value = [&
      -9999.9, &
      1.0, &
      0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])

  type(variable_metadata), public :: meta_test1d = variable_metadata( &
    name = 'TEST1D', &
    dim_names = [character(len=32) :: 'X', '', '', ''], &
    char_name = [character(len=32) :: &
      'long_name', &
      'units', &
      '', '', '', '', '', '', '', ''], &
    char_value = [character(len=32) :: &
      'Test 1D variable', &
      '-', &
      '', '', '', '', '', '', '', ''], &
    real_name = [character(len=32) :: &
      'missing_value', &
      'scale_factor', &
      '', '', '', '', '', '', '', ''], &
    real_value = [&
      -9999.9, &
      1.0, &
      0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])

  type(variable_metadata), public :: meta_test2d = variable_metadata( &
    name = 'TEST2D', &
    dim_names = [character(len=32) :: 'X', 'Y', '', ''], &
    char_name = [character(len=32) :: &
      'long_name', &
      'units', &
      '', '', '', '', '', '', '', ''], &
    char_value = [character(len=32) :: &
      'Test 2D variable', &
      '-', &
      '', '', '', '', '', '', '', ''], &
    real_name = [character(len=32) :: &
      'missing_value', &
      'scale_factor', &
      '', '', '', '', '', '', '', ''], &
    real_value = [&
      -9999.9, &
      1.0, &
      0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])

  type(variable_metadata), public :: meta_ri_grad_2d = variable_metadata( &
    name = 'Ri_grad', &
    dim_names = [character(len=32) :: 'Z', 'Time', '', ''])

  type(variable_metadata), public :: meta_kh_2d = variable_metadata( &
    name = 'kh', &
    dim_names = [character(len=32) :: 'Z', 'Time', '', ''], &
    real_name = [character(len=32) :: &
    'missing_value', &
    'scale_factor', &
    '', '', '', '', '', '', '', ''], &
  real_value = [&
    -9999.9, &
    -3.0, &
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])

  type(variable_metadata), public :: meta_km_2d = variable_metadata( &
    name = 'km', &
    dim_names = [character(len=32) :: 'Z', 'Time', '', ''], &
    real_name = [character(len=32) :: &
    'missing_value', &
    'scale_factor', &
    '', '', '', '', '', '', '', ''], &
  real_value = [&
    -9999.9, &
    -3.0, &
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])

end module io_metadata