"""
Greenery in idf test
SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2022 Concordia CERC group
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
"""
from pathlib import Path
from unittest import TestCase

import hub.helpers.constants as cte
from hub.city_model_structure.greenery.plant import Plant
from hub.city_model_structure.greenery.soil import Soil
from hub.city_model_structure.greenery.vegetation import Vegetation
from hub.exports.energy_building_exports_factory import EnergyBuildingsExportsFactory
from hub.imports.construction_factory import ConstructionFactory
from hub.imports.geometry_factory import GeometryFactory
from hub.imports.usage_factory import UsageFactory
from hub.imports.weather_factory import WeatherFactory


class GreeneryInIdf(TestCase):
  """
  GreeneryInIdf TestCase 1
  """
  def test_greenery_in_idf(self):

    self._example_path = (Path(__file__).parent / 'tests_data').resolve()
    output_path = (Path(__file__).parent / 'tests_outputs').resolve()
    city_file = (self._example_path / "one_building_in_kelowna.gml").resolve()
    city = GeometryFactory('citygml', path=city_file).city
    for building in city.buildings:
      building.year_of_construction = 2006
    ConstructionFactory('nrel', city).enrich()
    UsageFactory('comnet', city).enrich()
    WeatherFactory('epw', city).enrich()
    vegetation_name = 'BaseEco'
    soil_thickness = 0.18
    soil_name = 'EcoRoofSoil'
    roughness = 'MediumSmooth'
    dry_conductivity = 0.4
    dry_density = 641
    dry_specific_heat = 1100
    thermal_absorptance = 0.95
    solar_absorptance = 0.8
    visible_absorptance = 0.7
    saturation_volumetric_moisture_content = 0.4
    residual_volumetric_moisture_content = 0.01
    soil = Soil(soil_name, roughness, dry_conductivity, dry_density, dry_specific_heat, thermal_absorptance,
                solar_absorptance, visible_absorptance, saturation_volumetric_moisture_content,
                residual_volumetric_moisture_content)
    soil.initial_volumetric_moisture_content = 0.2
    plant_name = 'plant'
    height = 0.5
    leaf_area_index = 5
    leaf_reflectivity = 0.2
    leaf_emissivity = 0.95
    minimal_stomatal_resistance = 180
    co2_sequestration = 0
    grows_on_soils = [soil]
    plant = Plant(plant_name, height, leaf_area_index, leaf_reflectivity, leaf_emissivity, minimal_stomatal_resistance,
                  co2_sequestration, grows_on_soils)
    plant.percentage = 1
    plants = [plant]
    vegetation = Vegetation(vegetation_name, soil, soil_thickness, plants)
    for building in city.buildings:
      for surface in building.surfaces:
        if surface.type == cte.ROOF:
          surface.vegetation = vegetation

    _idf = EnergyBuildingsExportsFactory('idf', city, output_path).export()
    self.assertIsNotNone(_idf)
    city = GeometryFactory('citygml', path=city_file).city
    for building in city.buildings:
      building.year_of_construction = 2006
    ConstructionFactory('nrel', city).enrich()
    UsageFactory('comnet', city).enrich()
    WeatherFactory('epw', city).enrich()
    _idf = EnergyBuildingsExportsFactory('idf', city, output_path).export()
    self.assertIsNotNone(_idf)