o
    Wi[U                     @   s  d dl Zd dlZd dlmZ d dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZ ejejejeZejedZejedZejedZejed  d Zejejdeeeejgd	 eeZed
 ed ede    edeje  ed
 ddddddddddddgZ!ejedZ"dd Z#dd Z$dd Z%dd Z&efd d!Z'd"d# Z(d$d% Z)ed&krGe
j*d'd(Z+e+j,d)d*d+d, e+- Z.e$  e% Z/e.j0r,ed
 ed- ed
 eZ1ej2e1se3d.e1  e3d/ e4d0 e)e1e/r ed1 dS e3d2 e4d0 dS ed
 ed3 ed
 e'e!e/ ed4 dS dS )5    N)FeatureLayer)datetimeoat_nature_datazOAT_ArcGIS_OAT_Only.xlsxzOAT_ArcGIS_OAT_Only_data.jsonz.logz)%(asctime)s - %(levelname)s - %(message)s)levelformathandlersz2==================================================zScript startedzCurrent working directory: zLog file location: Site_Boundarieszlhttps://services-eu1.arcgis.com/N7YlixcRxR5tv3qH/arcgis/rest/services/Site_Boundary_Map_View/FeatureServer/0)nameurlMapper_Microhabitatszehttps://services-eu1.arcgis.com/N7YlixcRxR5tv3qH/arcgis/rest/services/Map_Viewer_View/FeatureServer/0Mapper_Lineszehttps://services-eu1.arcgis.com/N7YlixcRxR5tv3qH/arcgis/rest/services/Map_Viewer_View/FeatureServer/1Mapper_Areaszehttps://services-eu1.arcgis.com/N7YlixcRxR5tv3qH/arcgis/rest/services/Map_Viewer_View/FeatureServer/2zOAT_schools.csvc                 C   sj   | j rg S | tdtdgd}|jD ]}||   r/|| d||  d||< q|	dS )zRClean pandas DataFrame for JSON serialization by handling NaN and infinity values.infz-infNobjectrecords)
emptyreplacefloatcolumnsisnaanyastypewherenotnato_dict)dfdf_cleancol r   X/var/www/OAT-AI-Tools/oat-nature-park/oat_nature_data_utils/explore_oat_arcgis_fields.pyclean_dataframe_for_json0   s   
"
r    c                  C   s   t d tjts:t t d g dg dd} t| }|jtdd t dt d	t	| d
  d d S t dt  d S )Nz$Checking for OAT schools CSV file...z/ not found. Creating it with OAT school data...),iB iY i i+ i, i i i i i i i i i i in i
 i^ i  i  i! i" i" i # i# iL$ iV$ i& i& i-& i@& iq' i' ij+ i3- i1 ip6 i6 i]8 i: i@ iQA iTA iRD ),zGeorge Salter Academyz$Ormiston Shelfield Community AcademyzOrmiston Park Academyz#Ormiston Sandwell Community AcademyzOrmiston Bushfield Academyz%Ormiston Sir Stanley Matthews AcademyzOrmiston Bolingbroke AcademyzOrmiston Victory AcademyzOrmiston Venture AcademyzOrmiston Horizon Academyz$Ormiston Ilkeston Enterprise AcademyzOrmiston Rivers AcademyzOrmiston Maritime AcademyzOrmiston Forge AcademyzOrmiston Endeavour AcademyzThomas Wolsey Ormiston AcademyzOrmiston Sudbury AcademyzOrmiston South Parade AcademyzOrmiston Denes AcademyzOrmiston Bridge Academyz#Ormiston Cliff Park Primary AcademyzWodensborough Ormiston AcademyzOrmiston Herman Academyz$Stoke High School - Ormiston AcademyzOrmiston Six Villages AcademyzCliff Park Ormiston AcademyzOrmiston Meadows AcademyzOrmiston Beachcroft AcademyzOrmiston Latimer Academyz-Cowes Enterprise College, An Ormiston AcademyzOrmiston Chadwick AcademyzTenbury High Ormiston Academyz+City of Norwich School, An Ormiston AcademyzOrmiston Meridian AcademyzPackmoor Ormiston Academyz!Edward Worlledge Ormiston AcademyzOrmiston SWB AcademyzOrmiston NEW AcademyzFlegg High Ormiston AcademyzBroadland High Ormiston AcademyzSandymoor Ormiston AcademyzOrmiston Queensmill AcademyzBrownhills Ormiston Academyz&Ormiston Kensington Queensmill Academy)URNEstablishment nameF)indexzCreated  with r!   z OAT schools.zFound existing )
loggerinfoospathexistsOAT_SCHOOLS_CSVpd	DataFrameto_csvlen)oat_datar   r   r   r   ensure_oat_csv>   s   

$r0   c               
   C   s   z)t dt  tt} t| d tj }t dt	| dt  | W S  t
yA } zt dt d|   d }~ww )Nz!Attempting to load OAT URNs from r!   zSuccessfully loaded z OAT URNs from zError loading OAT URNs from : )r%   r&   r*   r+   read_csvsetr   strstripr.   	Exceptionerror)oat_dfoat_urnser   r   r   load_oat_urns_   s   
r;   c                 C   s  zt d| d t| }z|jddd}|}t d| d|  W n" tyG } zt d| d|  t W  Y d }~W S d }~ww d	}g }td
||D ]b}	z<t	|||	 }
t d|	d  d|	|
  d| d |jd||	d}|j
r||j
 t d|	d  d|	|
   W qR ty } zt d|	d  d|	|
  d|  W Y d }~qRd }~ww |st d|  t W S z5t dt| d| d g }t|dD ]4\}}|d	 d
krt d| dt| d |j}|di }|di }i |d|i}|| qt|}t d| d |jD ]}t d|  q!dd |jD |_dd |jD }|rt d|  |D ]}zzt d|  || tj ||< |d  tj |d < ||| |d   }|jst d!|  |j|d d"g |d d#d$}|d"  }t d%| d t|D ]}t d|  qt | dt| d& |W   W W S W qK ty } zt d'| d|  W Y d }~qKd }~ww t d( nt d)|  t W W S  ty } zt d*| d|  t W  Y d }~W S d }~ww  ty? } zt d+| d|  t W  Y d }~S d }~ww ),NzDownloading data from ...z1=1T)r   return_count_onlyzTotal records in r1   z Error getting record count from i  r   zFetching records     to  of )r   result_record_countresult_offsetzSuccessfully fetched batch zError fetching batch zNo records found in zProcessing z records from zProcessing record 
attributesgeometryz
Columns in :- c                 S   s   g | ]
}| d d qS )_ )r   title).0r   r   r   r   
<listcomp>   s    z'get_layer_dataframe.<locals>.<listcomp>c                    s&   g | ] t  fd ddD r qS )c                 3   s    | ]	}|   v V  qd S )N)upper)rJ   urn_termr   r   r   	<genexpr>   s    z1get_layer_dataframe.<locals>.<listcomp>.<genexpr>)r!   SCHOOLID)r   )rJ   r   rN   r   rK      s   & z
Potential URN columns found: zTrying to filter using column: r!   z$Successfully filtered using column: r"   left)left_onright_onhowz
Schools with data in z OAT records found.zError filtering with column z=None of the potential URN columns contained matching OAT URNsz"No potential URN columns found in zError processing data from zError accessing )r%   r&   r   queryr6   r7   r+   r,   rangeminfeaturesextendwarningr.   	enumerateas_dictgetappendr   r   r4   r5   isinr   mergeuniquesorted)	layer_url
layer_namer8   feature_layercount_resulttotal_recordsr:   
batch_sizeall_recordsoffsetcurrent_batchquery_resultr   ifeaturerecordattrsgeomcombinedr   r   urn_colsurn_colfiltered_dfschools_foundschoolr   r   r   get_layer_dataframej   s   &$



ry   c                 C   s  zt d d}i }t }t| }t| dD ]n\}}zKt d| d| d|d   t|d |d |}	|	d urZ|	jsZ|	||d < d	}||	d
   t d| d|  nt 	d|d  d W q t
y }
 zt d|d  d|
  W Y d }
~
qd }
~
ww |st 	d W d S zit d| d tj|ddO}t|}t| dD ];\}\}}	t d| d| d|  |d d dddd}|	j||dd t d| d| dt|	 d qW d    n1 sw   Y  W n t
y }
 zt d|
  W Y d }
~
W d S d }
~
ww zWt|d
 }|| }t d t d  t|D ]}t d!|  q0t d"t|  t d# t|D ]}t d!|  qOt d$t|  t d%|  W n t
y }
 zt d&|
  W Y d }
~
W d S d }
~
ww z#t d' t d( t||rt d) n	t 	d* W W d S W W d S  t
y }
 zt d+|
  t 	d, W Y d }
~
W d S d }
~
ww  t
y }
 zt d-|
  W Y d }
~
d S d }
~
ww ).NzStarting export process...Fr>   zProcessing layer r@   r1   r	   r
   Tr"   zSuccessfully processed layer zNo OAT data for z, skipping.zError processing layer zENo OAT data found in any ArcGIS layer. No Excel file will be created.zWriting data to r<   openpyxl)enginezWriting sheet    /rG   rH   )
sheet_namer#   	Exported z (OAT only) to sheet 'z' with z rows.zError writing to Excel file: z
=== SUMMARY OF SCHOOLS ===z
Schools with data downloaded:rF   z
Total schools with data: z
Schools without data:z
Total schools without data: z)
All OAT-related ArcGIS data exported to zError creating summary: z3
==================================================zStarting JSON export...z"JSON export completed successfullyzBJSON export completed with errors, but Excel export was successfulzError during JSON export: z3Excel export was successful, but JSON export failedz%Error in export_all_layers_to_excel: )r%   r&   r3   r.   r\   ry   r   updaterb   r[   r6   r7   r+   ExcelWriteritemsr   to_excelrc   export_all_layers_to_json)layersr8   output_fileoat_data_foundall_dataschools_with_datatotal_layersrn   layerr   r:   writertotal_sheetsre   r~   all_schoolsschools_without_datarx   r   r   r   export_all_layers_to_excel   s   
 
$




r   c                 C   s  znt d ddddd}i }|  D ]s\}}||| dd}t|}|||< tj	t
d	| d
}z3t|ddd}	tj||	ddd W d   n1 sSw   Y  t d| d| dt| d W q ty }
 zt d| d|
  W Y d}
~
qd}
~
ww dD ]
}||vrg ||< qg }z$| D ]\}}|t|d |d d qt dt| d W n ty }
 zt d|
  g }W Y d}
~
nd}
~
ww ||dg |dg |dg |dg d}zittddd}	tj||	ddd W d   n	1 sw   Y  t d t  t d!t|d"   t d#t|d   t d$t|d   t d%t|d   t d&t|d   W W d(S  tyo }
 z	t d'|
   d}
~
ww  ty }
 zt d)|
  W Y d}
~
dS d}
~
ww )*zDExport all layer data to JSON files, including ALL schools from CSV.zStarting JSON export process...site_boundariesmicrohabitatslinesareasr   r   r   r   rH   rG   OAT_ArcGIS_OAT_Only_z.jsonwzutf-8)encoding   F)indentensure_asciiNr   r?   r$   z recordsz'Error writing individual JSON file for r1   )r   r   r   r   r!   r"   )urnr	   z	Included z. schools in JSON output (all schools from CSV)zError generating schools list: )schoolsr   r   r   r   z'Successfully exported combined JSON to z  - Schools: r   z  - Site Boundaries: z  - Microhabitats: z  - Lines: z  - Areas: z"Error writing combined JSON file: Tz$Error in export_all_layers_to_json: )r%   r&   r   r^   lowerr   r    r'   r(   joinOAT_NATURE_DATA_DIRopenjsondumpr.   r6   r7   iterrowsr_   r4   COMBINED_JSON_FILE)r   r8   layer_mapping	json_datare   r   json_keycleaned_dataindividual_json_filefr:   r   rG   rowcombined_datar   r   r   r   ,  s   

&"





	r   c              
   C   s8  zt d|   tj| dd}ddgddgdd	gd
dgd}i }| D ]U\}}d}| D ])\}}	|	D ]}
|
 dddd| ddddv rS|} nq5|rX nq/|rq|||< t d| d| dt| d q%t d| d q%t	||W S  t
y } zt d|  W Y d}~dS d}~ww )z-Generate JSON files from existing Excel file.zReading Excel file: N)r~   r   Site_Boundaryr   Mapper_Microhabitatr   Mapper_Liner   Mapper_Arear   rG    rH   zLoaded sheet 'z' as r$   z rowszUnknown sheet 'z', skippingz"Error generating JSON from Excel: F)r%   r&   r+   
read_excelr   r   r   r.   r[   r   r6   r7   )
excel_filer8   
excel_datalayer_to_sheet_patternsr   r~   r   re   orig_layer_namepatternspatternr:   r   r   r   generate_json_from_excelz  s<   0$r   __main__z4Export OAT Nature data from ArcGIS to Excel and JSON)descriptionz--json-only
store_truezCGenerate JSON files from existing Excel file (skip ArcGIS download))actionhelpz8JSON-ONLY MODE: Generating JSON from existing Excel filezExcel file not found: z@Please run without --json-only flag to generate Excel file firstr>   z&JSON generation completed successfullyzJSON generation failedzGFULL EXPORT MODE: Downloading from ArcGIS and exporting to Excel + JSONz%ArcGIS data export process completed.)5pandasr+   	geopandasgpdarcgis.featuresr   r'   sysloggingr   argparser   r(   dirnameabspath__file__PROJECT_ROOTr   r   OUTPUT_FILEr   splitextlog_filenamebasicConfigINFOFileHandlerStreamHandlerstdout	getLogger__name__r%   r&   getcwdr   r*   r    r0   r;   ry   r   r   r   ArgumentParserparseradd_argument
parse_argsargsr8   	json_onlyr   r)   r7   exitr   r   r   r   <module>   s    




!qQN
(









