from __future__ import print_function
import ctypes
import fnmatch
from pprint import pprint

import grass.lib.gis as libgis
import grass.lib.raster as libraster


def attributes(obj):
    return sorted(fnmatch.filter(dir(obj), '[!_]*'))


def struct2items(struct):
    struct = struct.contents if hasattr(struct, 'contents') else struct
    return [(attr, getattr(struct, attr)) for attr in attributes(struct)]


###################################################
# instantiate the region struct
print('Create an empty region struct')
c_region = ctypes.pointer(libgis.Cell_head())
pprint(struct2items(c_region))


print('Read current region')
libgis.G_get_set_window(c_region)
pprint(struct2items(c_region))
print('rows:', libraster.Rast_window_rows(),
      'cols:', libraster.Rast_window_cols())

print('Change region extent and set as current')
# change region attributes
c_region.contents.west = 644530.0
c_region.contents.south = 228070.0
# adjust accordingly the number of rows and columns
libgis.G_adjust_Cell_head(c_region, False, False)
libgis.G_set_window(c_region)
pprint(struct2items(c_region))

print('rows:', libraster.Rast_window_rows(),
      'cols:', libraster.Rast_window_cols())

c_region_new = ctypes.pointer(libgis.Cell_head())
libgis.G_get_set_window(c_region_new)
pprint(struct2items(c_region_new))