from osgeo import gdal
import zipfile
import tempfile
import os


def is_geotiff(resource, file_name):
    dataset = gdal.Open(file_name)

    if not dataset:
        resource["error"] = f"could not read file {file_name}"
        return False

    geotransform = dataset.GetGeoTransform()
    default_transform = (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)

    if geotransform == default_transform:
        resource["error"] = "missing transformation"
        return False

    return True


def is_valid(resource, file):
    """Check if the content is a GeoTIFF file."""

    # Some GeoTIFF files consist for two files in a ZIP file:
    #  - the TIFF image itself
    #  - a TFW world file with the transform information
    if zipfile.is_zipfile(file.name):
        with tempfile.TemporaryDirectory() as temp_dir:
            with zipfile.ZipFile(file.name, "r") as zip_ref:
                file_list = zip_ref.namelist()
                relevant_files = [
                    file
                    for file in file_list
                    if file.lower().endswith(".tiff") or file.lower().endswith(".tif")
                ]
                contains_at_least_one_relevant_file = len(relevant_files) > 0
                if contains_at_least_one_relevant_file:
                    zip_ref.extractall(temp_dir)
                    for tif_name in relevant_files:
                        tif_path = os.path.join(temp_dir, tif_name)
                        if is_geotiff(resource, tif_path):
                            # the ZIP file contains at least one valid GeoTIFF
                            return True
                else:
                    resource["error"] = "ZIP file contains not TIFF image"
                    return False
    else:
        return is_geotiff(resource, file.name)