o
    Gh1                     @   s   d Z ddlZddlmZmZmZmZmZ ddlm	Z	 ddl
mZ ddlmZ edeZd	d
 Zede	dd Zede	dd Zejddgde	dd Zejddgde	dd Zede	dd Zejddgde	dd ZdS )a  
map_routes.py

Purpose:
  Map and marker endpoints used by the Leaflet-based map UI. Provides logic for
  camera locations and generic fauna/structure markers. Performs schema
  migrations-on-boot for required columns/tables.

Routes:
  - GET /karta
  - GET /get_available_cameras
  - POST /add_camera_marker
  - POST /add_item_marker
  - GET /get_marker_locations
  - POST /delete_marker
    N)	Blueprintrender_templatejsonifyrequestsession   )login_required)get_db)validate_geographic_coordinates
map_routesc                 C   s   dd |  d D }d|vr"z|  d W n
 tjy!   Y nw d|vr8z|  d W n
 tjy7   Y nw |  d |   d S )	Nc                 S   s   g | ]}|d  qS )r    .0rowr   r   '/var/www/html/app_modules/map_routes.py
<listcomp>   s    z&_ensure_map_schema.<locals>.<listcomp>zPRAGMA table_info(cameras)added_to_mapz=ALTER TABLE cameras ADD COLUMN added_to_map INTEGER DEFAULT 0locationz,ALTER TABLE cameras ADD COLUMN location TEXTzCREATE TABLE IF NOT EXISTS markers ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, type TEXT NOT NULL, latitude REAL NOT NULL, longitude REAL NOT NULL, name TEXT))executefetchallsqlite3Errorcommit)dbcolsr   r   r   _ensure_map_schema   s"   	r   z/kartac                   C   s   t dS )Nzmap.html)r   r   r   r   r   map_page4   s   r   z/get_available_camerasc                  C   s:   t  } t|  | dtd f}dd | D }t|S )NzSELECT camera_id, camera_name, IFNULL(added_to_map, 0) AS added_to_map FROM cameras WHERE user_id=? AND IFNULL(added_to_map, 0)=0 ORDER BY camera_name COLLATE NOCASEuser_idc                 S   s$   g | ]}|d  |d |d dqS )	camera_idcamera_namer   )r   namer   r   r   r   r   r   r   E   s   $ z)get_available_cameras.<locals>.<listcomp>)r	   r   r   r   r   r   )r   curdatar   r   r   get_available_cameras:   s   r#   z/add_camera_markerPOST)methodsc                  C   s\  t jrt jdpt jdnd } t jr t jdpt jdnd }t jdp2t jr1t jdnd }| r;|r;|sDtddddfS t| |\}}}|sWtd|ddfS |\}}t }t	| |
d	td
 |f }	|	sytddddfS | d| }
z|
d|
td
 |f |  td|	d |dW S  tjy   tddddf Y S w )Nlatlngr    FNedostaju podaci.successmessage  z?SELECT camera_name FROM cameras WHERE user_id=? AND camera_id=?r   u   Kamera nije pronađena.i  ,zMUPDATE cameras SET location=?, added_to_map=1 WHERE user_id=? AND camera_id=?Tr   )r+   r   r      Greška baze.  )r   is_jsonformgetjsonstripr   r
   r	   r   r   r   fetchoner   r   r   )r&   r'   r   valid	error_msgcoordinateslat_flng_fr   r   r   r   r   r   add_camera_markerI   s4     &r<   z/add_item_markerc                  C   sP  t jrt jdpt jdnd } t jr t jdpt jdnd }t jdp2t jr1t jdnd }t jdpEt jrDt jdnd }|sL|}| rR|rR|s[tdddd	fS t| |\}}}|sntd|dd	fS |\}}t }	t	|	 z|	
d
td ||||f}
|	  td||
jdW S  tjy   tddddf Y S w )Nr&   r'   	item_typer(   	item_nameFr)   r*   r-   zUINSERT INTO markers (user_id, type, latitude, longitude, name) VALUES (?, ?, ?, ?, ?)r   T)r+   r>   item_idr/   r0   )r   r1   r2   r3   r4   r5   r   r
   r	   r   r   r   r   	lastrowidr   r   )r&   r'   r=   r>   r7   r8   r9   r:   r;   r   r!   r   r   r   add_item_markerf   s2     &&rA   z/get_marker_locationsc               	   C   s   t  } t|  g }| dtd f D ]}||d |d |d |d |d p+|d d q| d	td f D ]2}z|d
 pCdd\}}t|}t|}W n	 ty[   Y q;w |t	|d d|||d d q;t
|S )NzGSELECT id, type, latitude, longitude, name FROM markers WHERE user_id=?r   idtypelatitude	longituder    )rB   rC   rD   rE   r    z}SELECT camera_id, camera_name, location FROM cameras WHERE user_id=? AND IFNULL(added_to_map,0)=1 AND IFNULL(location,"")<>""r   r(   r.   r   camerar   )r	   r   r   r   r   appendsplitfloat	Exceptionstrr   )r   resultmclat_slng_sr:   r;   r   r   r   get_marker_locations   s4   


rQ   z/delete_markerc                  C   s   t jdpt jrt jdnd } t jdp#t jr"t jdnd }| s1tddddfS t }t| z.|dkrR|	d	t
d
 | f |  tddiW S |	d| t
d
 f |  tddiW S  tjyy   tddddf Y S w )Nr?   r(   r=   Fr)   r*   r-   rF   zPUPDATE cameras SET location=NULL, added_to_map=0 WHERE user_id=? AND camera_id=?r   r+   Tz,DELETE FROM markers WHERE id=? AND user_id=?r/   r0   )r   r2   r3   r1   r4   r5   r   r	   r   r   r   r   r   r   )r?   r=   r   r   r   r   delete_marker   s"   &&rR   )__doc__r   flaskr   r   r   r   r   securityr   r   r	   security_enhancementsr
   __name__bpr   router   r#   r<   rA   rQ   rR   r   r   r   r   <module>   s4    
