generate_kmlfile_from_gpxdata.py
# ------------------------------------------------------------------------------#
import xml.etree.ElementTree as ET;

from string import Template;
from typing import Dict,Tuple;

# ------------------------------------------------------------------------------#

from pyfiles.extract_kmldata_outof_gpxfile import TypeCoords;

# ------------------------------------------------------------------------------#

def findKmlFolder(fromElem: ET.Element,
                  withName: str,ns: Dict) -> ET.Element:
    for fd in fromElem.findall('KML:Folder',ns):
        if withName==fd.find('KML:name',ns).text: return fd;
    # end for

# end def findKmlFolder

# ------------------------------------------------------------------------------#

WaypointTemplate=''' 
 <Placemark> 
     <name>*PlacemarkName*</name> 
     <styleUrl>#waypoint</styleUrl> 
     <Point> 
         <coordinates>*CoordinatesString*</coordinates> 
     </Point> 
 </Placemark> 
 '''

# ------------------------------------------------------------------------------#

TypeWaypointsData=Dict[str,TypeCoords];
TypeTrackpathData=Tuple[str,str];
TypeDocData=Tuple[str,str];

def generateKmlFile(templateFilePath: str,
                    docData: TypeDocData,
                    waypointsData: TypeWaypointsData,
                    trackpathData: TypeTrackpathData,
                    outputFilePath: str) -> None:
    #
    ns={'KML':'http://www.opengis.net/kml/2.2'};

    with open(templateFilePath,mode='r',encoding='utf-8') as fReader:
        etree=ET.parse(fReader);

    root=etree.getroot();
    doc=root.find('KML:Document',ns);

    # --------------------------------------------------------------------------#

    (fileName,crInfo)=docData;
    # Set document name
    tpl=Template("![CDATA[$name]]");
    docName=doc.find('KML:name',ns);
    docName.text=tpl.substitute(name=fileName);

    # Set creation information
    snippet=doc.find('KML:snippet',ns);
    snippet.text=crInfo;

    # --------------------------------------------------------------------------#

    # Set names and coordinates of waypoints
    waypointsFolder=findKmlFolder(doc,'Waypoints',ns);
    ix=0;
    for (name,coords) in waypointsData.items():
        ix+=1;
        plmElem=ET.fromstring(WaypointTemplate);
        plmElem[0].text=name;
        plmElem[2][0].text=coords;

        waypointsFolder.insert(ix,plmElem);
    # end for

    # --------------------------------------------------------------------------#

    (trackName,pathCoords)=trackpathData;

    # Set name and path coordinates of the track
    outerTrackFolder=findKmlFolder(doc,'Tracks',ns);
    outerTrackFolder[1][0].text=trackName;

    pathPlacemark=outerTrackFolder[1][1];
    pathPlacemark[2][1].text=pathCoords;

    # --------------------------------------------------------------------------#

    # Write kml-file
    ET.register_namespace('',ns['KML']);
    etree.write(outputFilePath,
                encoding='utf-8',
                xml_declaration=True);

    # --------------------------------------------------------------------------#

# end def generateKmlFile

# ------------------------------------------------------------------------------#
# ------------------------------------------------------------------------------#
if __name__=='__main__':
    print('\n# Beginning TEST generate_kmlfile_from_gpxdata.py ...\n');
    # --------------------------------------------------------------------------#

    # --------------------------------------------------------------------------#
    print('\n# Finished TEST generate_kmlfile_from_gpxdata.py.\n');
# end if main

# ------------------------------------------------------------------------------#
# ------------------------------------------------------------------------------#