import unittest
from unittest.mock import patch, MagicMock
from geodata_pipeline.river_erosion import _find_lake_depths
from geodata_pipeline.config import Config, LakeConfig

class TestRiverLakes(unittest.TestCase):
    @patch("geodata_pipeline.river_erosion.ogr")
    def test_find_lake_depths(self, mock_ogr):
        # Mock OGR DataSource and Layer
        mock_ds = MagicMock()
        mock_layer = MagicMock()
        mock_ogr.Open.return_value = mock_ds
        mock_ds.GetLayer.return_value = mock_layer
        
        # Mock Feature
        mock_feat = MagicMock()
        mock_feat.GetField.return_value = 15.5 # Depth_avg
        mock_feat.GetFID.return_value = 123
        
        # Mock Geometry
        mock_geom = MagicMock()
        mock_feat.GetGeometryRef.return_value = mock_geom
        # When Distance is called on the feature geometry (transformed), return float
        mock_transformed_geom = MagicMock()
        mock_geom.Clone.return_value = mock_transformed_geom
        mock_transformed_geom.Distance.return_value = 10.0
        
        # Setup layer behavior
        mock_layer.__iter__.return_value = [mock_feat]
        mock_layer.GetNextFeature.side_effect = [mock_feat, None]
        
        # Config
        cfg = Config.default()
        cfg.river_erosion.lakes.enabled = True
        cfg.river_erosion.lakes.match_tolerance_m = 100.0
        
        # Manual lake centroid (shapely point or similar, but here we pass tuple/object depending on implementation)
        # Let's assume we pass a list of (x, y) tuples for centroids
        manual_lakes = [(333000.0, 5517000.0)]
        
        # Since _find_lake_depths expects OGR geometries for the manual lakes (or constructs them),
        # let's assume we pass OGR geometries to it, or it creates them.
        # Ideally, it should accept a list of OGR Geometries (Polygons from the mask).
        
        # For this test, I'll assume we pass a list of ogr.Geometry objects.
        mock_manual_geom = MagicMock()
        mock_manual_geom.Centroid.return_value = mock_manual_geom
        mock_manual_geom.Clone.return_value = mock_manual_geom # For transform
        mock_manual_geom.GetPoint.return_value = (333000.0, 5517000.0)
        
        mock_srs = MagicMock()
        mock_srs.IsSame.return_value = True # Simplify: same CRS
        
        results = _find_lake_depths(
            [mock_manual_geom],
            mock_srs,
            cfg.river_erosion.lakes,
            "raw/hydrolakes/HydroLAKES_polys_v10_shp/HydroLAKES_polys_v10.shp"
        )
        
        # Expected result: List of (depth, metadata)
        # depth should be 15.5
        self.assertEqual(len(results), 1)
        depth, metadata = results[0]
        self.assertEqual(depth, 15.5)
        self.assertEqual(metadata["id"], 123)
        self.assertEqual(metadata["distance"], 10.0)

if __name__ == "__main__":
    unittest.main()
