#===== prj_material_property =====


#' prj_material_property
#' @description tag: material_property
#' @param fluid prj_fluid:
#' @param porous_medium prj_porous_medium:
#' @example man/examples/ex_prj_material_property.R
#' @export
prj_material_property <- function(fluid,
                                     porous_medium) {

    # Add coercing utility here

    new_prj_material_property(fluid,
                                 porous_medium)
}


new_prj_material_property <- function(fluid,
                                         porous_medium) {

    assertthat::assert_that(class(fluid) == "prj_fluid")

    is_wrapper_list(porous_medium, "prj_porous_medium")

    structure(list(fluid = fluid,
                   porous_medium = porous_medium,
                   xpath = "processes/process/material_property",
                   attr_names = character(),
                   flatten_on_exp = character()
    ),
    class = "prj_material_property"
    )
}


#===== prj_fluid =====


#' prj_fluid
#' @description tag: fluid
#' @param liquid_density list:
#' @param gas_density list:
#' @param liquid_viscosity list:
#' @param gas_viscosity list:
#' @param specific_heat_capacity_solid Optional:
#' @param specific_heat_capacity_water Optional:
#' @param specific_heat_capacity_air Optional:
#' @param specific_heat_capacity_water_vapor Optional:
#' @param thermal_conductivity_dry_solid Optional:
#' @param thermal_conductivity_wet_solid Optional:
#' @example man/examples/ex_prj_fluid.R
#' @export
prj_fluid <- function(liquid_density,
                         gas_density,
                         liquid_viscosity,
                         gas_viscosity,
                         specific_heat_capacity_solid = NULL,
                         specific_heat_capacity_water = NULL,
                         specific_heat_capacity_air = NULL,
                         specific_heat_capacity_water_vapor = NULL,
                         thermal_conductivity_dry_solid = NULL,
                         thermal_conductivity_wet_solid = NULL) {

    # Add coercing utility here

    new_prj_fluid(liquid_density,
                     gas_density,
                     liquid_viscosity,
                     gas_viscosity,
                     specific_heat_capacity_solid,
                     specific_heat_capacity_water,
                     specific_heat_capacity_air,
                     specific_heat_capacity_water_vapor,
                     thermal_conductivity_dry_solid,
                     thermal_conductivity_wet_solid)
}


new_prj_fluid <- function(liquid_density,
                             gas_density,
                             liquid_viscosity,
                             gas_viscosity,
                             specific_heat_capacity_solid = NULL,
                             specific_heat_capacity_water = NULL,
                             specific_heat_capacity_air = NULL,
                             specific_heat_capacity_water_vapor = NULL,
                             thermal_conductivity_dry_solid = NULL,
                             thermal_conductivity_wet_solid = NULL) {


    type_value_names <- c("type", "value")

    liquid_density <- coerce_names(liquid_density, type_value_names)

    gas_density <- coerce_names(gas_density, c("type",
                                                      "molar_mass"))

    liquid_viscosity <- coerce_names(liquid_viscosity, type_value_names)

    gas_viscosity <- coerce_names(gas_viscosity, type_value_names)

    if(!is.null(specific_heat_capacity_solid)){
        specific_heat_capacity_solid <-
            coerce_names(specific_heat_capacity_solid, type_value_names)
    }

    if(!is.null(specific_heat_capacity_water)){
        specific_heat_capacity_water <-
            coerce_names(specific_heat_capacity_water, type_value_names)
    }

    if(!is.null(specific_heat_capacity_air)){
        specific_heat_capacity_air <-
            coerce_names(specific_heat_capacity_air, type_value_names)
    }


    if(!is.null(specific_heat_capacity_water_vapor)){
        specific_heat_capacity_water_vapor <-
            coerce_names(specific_heat_capacity_water_vapor,
                                type_value_names)
    }

    if(!is.null(thermal_conductivity_dry_solid)){
        thermal_conductivity_dry_solid <-
            coerce_names(thermal_conductivity_dry_solid,
                                type_value_names)
    }

    if(!is.null(thermal_conductivity_wet_solid)){
        thermal_conductivity_wet_solid <-
            coerce_names(thermal_conductivity_wet_solid,
                                type_value_names)
    }

    structure(list(liquid_density = liquid_density,
                   gas_density = gas_density,
                   liquid_viscosity = liquid_viscosity,
                   gas_viscosity = gas_viscosity,
                   specific_heat_capacity_solid = specific_heat_capacity_solid,
                   specific_heat_capacity_water = specific_heat_capacity_water,
                   specific_heat_capacity_air = specific_heat_capacity_air,
                   specific_heat_capacity_water_vapor =
                       specific_heat_capacity_water_vapor,
                   thermal_conductivity_dry_solid =
                       thermal_conductivity_dry_solid,
                   thermal_conductivity_wet_solid =
                       thermal_conductivity_wet_solid,
                   xpath = "processes/process/material_property/fluid",
                   attr_names = character(),
                   flatten_on_exp = character()
    ),
    class = "prj_fluid"
    )
}