# *******************************************************************************
# Honeybee OpenStudio Gem, Copyright (c) 2020, Alliance for Sustainable
# Energy, LLC, Ladybug Tools LLC and other contributors. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# (1) Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# (2) Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# (3) Neither the name of the copyright holder nor the names of any contributors
# may be used to endorse or promote products derived from this software without
# specific prior written permission from the respective party.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
# UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
# THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# *******************************************************************************

require 'honeybee/material/window_blind'

require 'to_openstudio/model_object'

module Honeybee
  class EnergyWindowMaterialBlind

    def find_existing_openstudio_object(openstudio_model)
      object = openstudio_model.getBlindByName(@hash[:identifier])
      return object.get if object.is_initialized
      nil
    end

    def to_openstudio(openstudio_model)
      # create blind OpenStudio object
      os_blind = OpenStudio::Model::Blind.new(openstudio_model)
      os_blind.setName(@hash[:identifier])

      # assign slat orientation
      if @hash[:slat_orientation]
        os_blind.setSlatOrientation(@hash[:slat_orientation])
      else
        os_blind.setSlatOrientation(defaults[:slat_orientation][:default])
      end

      # assign slat width
      if @hash[:slat_width]
        os_blind.setSlatWidth(@hash[:slat_width])
      else
        os_blind.setSlatWidth(defaults[:slat_width][:default])
      end

      # assign slat separation if it exists
      if @hash[:slat_separation]
        os_blind.setSlatSeparation(@hash[:slat_separation])
      else
        os_blind.setSlatSeparation(defaults[:slat_separation][:default])
      end

      # assign slat thickness if it exists
      if @hash[:slat_thickness]
        os_blind.setSlatThickness(@hash[:slat_thickness])
      else
        os_blind.setSlatThickness(defaults[:slat_thickness][:default])
      end

      # assign slat angle if it exists
      if @hash[:slat_angle]
        os_blind.setSlatAngle(@hash[:slat_angle])
      else
        os_blind.setSlatAngle(defaults[:slat_angle][:default])
      end

      # assign slat conductivity if it exists
      if @hash[:slat_conductivity]
        os_blind.setSlatConductivity(@hash[:slat_conductivity])
      else
        os_blind.setSlatConductivity(defaults[:slat_conductivity][:default])
      end

      # assign beam solar transmittance if it exists
      if @hash[:beam_solar_transmittance]
        os_blind.setSlatBeamSolarTransmittance(@hash[:beam_solar_transmittance])
      else
        os_blind.setSlatBeamSolarTransmittance(defaults[:beam_solar_transmittance][:default])
      end

      # assign beam solar reflectance front if it exists
      if @hash[:beam_solar_reflectance]
        os_blind.setFrontSideSlatBeamSolarReflectance(@hash[:beam_solar_reflectance])
      else
        os_blind.setFrontSideSlatBeamSolarReflectance(
          defaults[:beam_solar_reflectance][:default])
      end

      # assign beam solar reflectance back
      if @hash[:beam_solar_reflectance_back]
        os_blind.setBackSideSlatBeamSolarReflectance(@hash[:beam_solar_reflectance_back])
      else
        os_blind.setBackSideSlatBeamSolarReflectance(
          defaults[:beam_solar_reflectance_back][:default])
      end

      # assign diffuse solar transmittance
      if @hash[:diffuse_solar_transmittance]
        os_blind.setSlatDiffuseSolarTransmittance(@hash[:diffuse_solar_transmittance])
      else
        os_blind.setSlatDiffuseSolarTransmittance(
          defaults[:diffuse_solar_transmittance][:default])
      end

      # assign front diffuse solar reflectance
      if @hash[:diffuse_solar_reflectance]
        os_blind.setFrontSideSlatDiffuseSolarReflectance(@hash[:diffuse_solar_reflectance])
      else
        os_blind.setFrontSideSlatDiffuseSolarReflectance(
          defaults[:diffuse_solar_reflectance][:default])
      end

      # assign back diffuse solar reflectance
      if @hash[:diffuse_solar_reflectance_back]
        os_blind.setBackSideSlatDiffuseSolarReflectance(@hash[:diffuse_solar_reflectance_back])
      else
        os_blind.setBackSideSlatDiffuseSolarReflectance(
          defaults[:diffuse_solar_reflectance_back][:default])
      end

      # assign front diffuse visible transmittance
      if @hash[:diffuse_visible_transmittance]
        os_blind.setSlatDiffuseVisibleTransmittance(@hash[:diffuse_visible_transmittance])
      else
        os_blind.setSlatDiffuseVisibleTransmittance(
          defaults[:diffuse_visible_transmittance][:default])
      end

      # assign front diffuse visible reflectance
      if @hash[:diffuse_visible_reflectance]
        os_blind.setFrontSideSlatDiffuseVisibleReflectance(@hash[:diffuse_visible_reflectance])
      else
        os_blind.setFrontSideSlatDiffuseVisibleReflectance(
          defaults[:diffuse_visible_reflectance][:default])
      end

      # assign back diffuse visible reflectance
      if @hash[:diffuse_visible_reflectance_back]
        os_blind.setBackSideSlatDiffuseVisibleReflectance(@hash[:diffuse_visible_reflectance_back])
      else
        os_blind.setBackSideSlatDiffuseVisibleReflectance(
          defaults[:diffuse_visible_reflectance_back][:default])
      end

      # assign infrared transmittance
      if @hash[:infrared_transmittance]
        os_blind.setSlatInfraredHemisphericalTransmittance(@hash[:infrared_transmittance])
      else
        os_blind.setSlatInfraredHemisphericalTransmittance(
          defaults[:infrared_transmittance][:default])
      end

      # assign front side emissivity
      if @hash[:emissivity]
        os_blind.setFrontSideSlatInfraredHemisphericalEmissivity(@hash[:emissivity])
      else
        os_blind.setFrontSideSlatInfraredHemisphericalEmissivity(
          defaults[:emissivity][:default])
      end

      # assign back side emissivity
      if @hash[:emissivity_back]
        os_blind.setBackSideSlatInfraredHemisphericalEmissivity(@hash[:emissivity_back])
      else
        os_blind.setBackSideSlatInfraredHemisphericalEmissivity(
          defaults[:emissivity_back][:default])
      end

      # assign distance to glass
      if @hash[:distance_to_glass]
        os_blind.setBlindtoGlassDistance(@hash[:distance_to_glass])
      else
        os_blind.setBlindtoGlassDistance(defaults[:distance_to_glass][:default])
      end

      # assign top opening multiplier
      if @hash[:top_opening_multiplier]
        os_blind.setBlindTopOpeningMultiplier(@hash[:top_opening_multiplier])
      else
        os_blind.setBlindTopOpeningMultiplier(
          defaults[:top_opening_multiplier][:default])
      end

      # assign bottom opening multiplier
      if @hash[:bottom_opening_multiplier]
        os_blind.setBlindBottomOpeningMultiplier(@hash[:bottom_opening_multiplier])
      else
        os_blind.setBlindBottomOpeningMultiplier(
          defaults[:bottom_opening_multiplier][:default])
      end

      # assign left opening multiplier
      if @hash[:left_opening_multiplier]
        os_blind.setBlindLeftSideOpeningMultiplier(@hash[:left_opening_multiplier])
      else
        os_blind.setBlindLeftSideOpeningMultiplier(
          defaults[:left_opening_multiplier][:default])
      end

      # assign right opening multiplier
      if @hash[:right_opening_multiplier]
        os_blind.setBlindRightSideOpeningMultiplier(@hash[:right_opening_multiplier])
      else
        os_blind.setBlindRightSideOpeningMultiplier(
          defaults[:right_opening_multiplier][:default])
      end

      os_blind
    end
  end # EnergyWindowMaterialBlind
end # Honeybee