import { ProjectStatus, ProjectStep, ProjectStepExtended } from "@/craftable-pro/types";
import { Project } from "./types";


export default abstract class ProjectStepTransformer {

  static transformStep(project: Project, data: any, step: number) {
    switch (step) {
      case ProjectStep.STEP1: {
        return this.transformStep1(project, data);
      };
      case ProjectStep.STEP2: {
        return this.transformStep2(project, data);
      };
      case ProjectStep.STEP3: {
        return this.transformStep3(project, data);
      };
      case ProjectStep.STEP4: {
        return this.transformStep4(project, data);
      };
      case ProjectStep.STEP5: {
        return this.transformStep5(project, data);
      };
      case ProjectStep.STEP6: {
        return this.transformStep6(project, data);
      };
      case ProjectStep.STEP7: {
        return this.transformStep7(project, data);
      }
      default: {
        return {};
      };
    }
  }

  static transformStep1(project: Project, data: any) {
    if (this.isCompletedStep(project.status_extended, ProjectStepExtended.STEP1))  {
      return {
        status_extended: project.status_extended,
        jtsk_x: project.jtsk_x,
        jtsk_y: project.jtsk_y,
        area_border: project.area_border,
        building_border: project.building_border,
        adress_data: project.adress_data,
        building_ids: project.building_ids,
        outlines_source: project.outlines_source,
        step: project.step,
        project_id: project.ident,
        mapy_cz_api_key: data.mapy_cz_api_key,
      }
    } else {
      return {
        status_extended: project.status_extended,
        project_id: project.ident,
        mapy_cz_api_key: data.mapy_cz_api_key,
      }
    }
  }

  static transformStep2(project: Project, data: any) {
    if (this.isCompletedStep(project.status_extended, ProjectStepExtended.STEP2))  {
      return {
        status_extended: project.status_extended,
        area_border: project.area_border,
        building_border: project.building_border,
        point_clouds: project.point_clouds,
        project_id: project.ident,
        point_cloud_dates_search_by_coords: data.point_cloud_dates_search_by_coords,
        point_clouds_search_by_coords: data.point_clouds_search_by_coords,
        point_clouds_search_by_project: data.point_clouds_search_by_project,
        token: data.token,
      }
    } else {
      return {
        status_extended: project.status_extended,
        area_border: project.area_border,
        building_border: project.building_border,
        project_id: project.ident,
        point_cloud_dates_search_by_coords: data.point_cloud_dates_search_by_coords,
        point_clouds_search_by_coords: data.point_clouds_search_by_coords,
        token: data.token,
      }
    }
  }

  static transformStep3(project: Project, data: any) {
    if (this.isCompletedStep(project.status_extended, ProjectStepExtended.STEP3)) {
      return {
        status_extended: project.status_extended,
        area_border: project.area_border,
        building_border: project.building_border,
        input_points: project.input_points,
        input_lines: project.input_lines,
        base_objects: project.base_objects,
        project_id: project.ident,
        token: data.token,
        point_clouds_search_by_project: data.point_clouds_search_by_project,
        mapy_cz_api_key: data.mapy_cz_api_key,
        point_clouds: project.point_clouds,
        auto_drawing: project.auto_drawing,
      }
    } else {
      return {
        status_extended: project.status_extended,
        area_border: project.area_border,
        building_border: project.building_border,
        project_id: project.ident,
        token: data.token,
        point_clouds_search_by_project: data.point_clouds_search_by_project,
        mapy_cz_api_key: data.mapy_cz_api_key,
        point_clouds: project.point_clouds,
      }
    }
  }

  static transformStep4(project: Project, data: any) {
    if (this.isCompletedStep(project.status_extended, ProjectStepExtended.STEP4)) {
      return {
        status_extended: project.status_extended,
        area_border: project.area_border,
        building_border: project.building_border,
        input_points: project.input_points,
        input_lines: project.input_lines,
        base_objects: project.base_objects,
        ortho_layer_name: project.ortho_layer_name,
        point_clouds_trans: project.point_clouds_trans,
        calculation_settings: project.calculation_settings,
        roof_parts: project.roof_parts,
        walls: project.walls,
        project_id: project.ident,
        auto_drawing: project.auto_drawing,
      }
    } else {
      return {
        status_extended: project.status_extended,
        area_border: project.area_border,
        building_border: project.building_border,
        input_points: project.input_points,
        input_lines: project.input_lines,
        base_objects: project.base_objects,
        ortho_layer_name: project.ortho_layer_name,
        project_id: project.ident,
        auto_drawing: project.auto_drawing,
      }
    }
  }

  static transformStep5(project: Project, data: any) {
    return {
      status_extended: project.status_extended,
      point_clouds: project.point_clouds,
      roof_parts: project.roof_parts,
      walls: project.walls,
      base_objects: project.base_objects,
      elevation_levels: project.elevation_levels,
      calculation_settings: project.calculation_settings,
      point_clouds_trans: project.point_clouds_trans,
      area_border: project.area_border,
      building_border: project.building_border,
      project_id: project.ident,
      token: data.token,
      point_clouds_search_by_project: data.point_clouds_search_by_project,
    }
  }

  static transformStep6(project: Project, data: any) {
    return {
      status_extended: project.status_extended,
      area_border: project.area_border,
      building_border: project.building_border,
      roof_parts: project.roof_parts,
      walls: project.walls,
      point_clouds: project.point_clouds,
      base_objects: project.base_objects,
      terrains: project.terrains,
      point_clouds_trans: project.point_clouds_trans,
      area: project.area,
      volume: project.volume,
      ortho_layer_name: project.ortho_layer_name,
      jtsk_x: project.jtsk_x,
      jtsk_y: project.jtsk_y,
      adress_data: project.adress_data,
      roof_params: project.roof_params,
      roof_overhangs: project.roof_overhangs,
      project_id: project.ident,
      token: data.token,
      point_clouds_search_by_project: data.point_clouds_search_by_project,
      mapy_cz_api_key: data.mapy_cz_api_key,
    }
  }

  static transformStep7(project: Project, data: any) {
    return {
      point_clouds: project.point_clouds,
      roof_parts: project.roof_parts,
      walls: project.walls,
      base_objects: project.base_objects,
      terrains: project.terrains,
      elevation_levels: project.elevation_levels,
      point_clouds_trans: project.point_clouds_trans,
      area_border: project.area_border,
      building_border: project.building_border,
      ortho_layer_name: project.ortho_layer_name,
      project_id: project.ident,
      roof_params: project.roof_params,
      roof_overhangs: project.roof_overhangs,
      token: data.token,
      point_clouds_search_by_project: data.point_clouds_search_by_project,
      mapy_cz_api_key: data.mapy_cz_api_key,
    }
  }

  private static isCompletedStep(statusExtendedJson: string, step: number): boolean {
    let statusExtended = JSON.parse(statusExtendedJson);
    return ProjectStatus.COMPLETED == statusExtended[step];
  }
}
