import numpy as np
import json
from pathlib import Path
from ...common import PyProjectionGeometry, PyProjection, PyRegionOfIntrest


class BaseDataWriter():
    projection_name: str = 'projection'
    projection_geometry_name: str ='geometry'
    region_of_intrest_name: str = 'roi'

    def __init__(self, 
                 porjection_geometry_suffix: str, 
                 projection_suffix: str,
                 region_of_intrest_suffix: str):
        
        self.porjection_geometry_suffix = porjection_geometry_suffix
        self.projection_suffix = projection_suffix
        self.region_of_intrest_suffix = region_of_intrest_suffix

    def write_projection_geometry(self, save_path: Path, projection_geometry: PyProjectionGeometry):
        raise NotImplementedError
    
    def write_projection(self, save_path: Path, projection: PyProjection):
        raise NotImplementedError
    
    def write_region_of_intrest(self, save_path: Path, region_of_intrest: PyRegionOfIntrest):
        raise NotImplementedError
    
    def get_next_projection_save_path(self, save_folder: Path) -> Path:
        return self.get_projection_save_path_i(save_folder, self.number_of_projections(save_folder) + 1)

    def get_projection_save_path_i(self, save_folder: Path, i) -> Path:
        return save_folder / f'{self.projection_name}_{i:05}{self.projection_suffix}'
    
    def get_next_projection_geometry_save_path(self, save_folder: Path) -> Path:
        return self.get_projection_geometry_save_path_i(save_folder, self.number_of_projection_geometries(save_folder) + 1)

    def get_projection_geometry_save_path_i(self, save_folder: Path, i) -> Path:
        return save_folder / f'{self.projection_geometry_name}_{i:05}{self.porjection_geometry_suffix}'
    
    def get_next_region_of_intrest_save_path(self, save_folder: Path) -> Path:
        return self.get_region_of_intrest_save_path_i(save_folder, self.number_of_region_of_intrests(save_folder) + 1)

    def get_region_of_intrest_save_path_i(self, save_folder: Path, i) -> Path:
        return save_folder / f'{self.region_of_intrest_name}_{i:05}{self.region_of_intrest_suffix}'
    
    def number_of_projection_geometries(self, folder: Path) -> int:
        return len(list(folder.glob(f'{self.projection_geometry_name}*{self.porjection_geometry_suffix}')))
    
    def number_of_projections(self, folder: Path) -> int:
        return len(list(folder.glob(f'{self.projection_name}*{self.projection_suffix}')))
    
    def number_of_region_of_intrests(self, folder: Path) -> int:
        return len(list(folder.glob(f'{self.region_of_intrest_name}*{self.region_of_intrest_suffix}')))