from  generic.gn_request   import   Request # 
from  generic.gn_google_maps    import   gn_google_maps #
from datetime import datetime

import requests
# import urllib3
# urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

class google_maps(gn_google_maps):
    
    def __init__(self, argv:list):
        self.application_offline = True
        
        self.setup(argv)
        self.rote_handler()
        self.key_maps = self.rote_data['path']['key_maps']
        
        self.call("handler_" +self.rote)

        
    def handler_distance_matrix(self):

        self.distance_matrix_dados()

        base_url = 'https://maps.googleapis.com/maps/api/distancematrix/json?mode=driving&language=pt-BR'
        parametros = "&destinations={}&origins={}&key={}".format(self.ends_destinos, self.origems, self.key_maps)

        self.url_maps = "{}{}".format(base_url, parametros)

        self.distance_matrix_enviar()

    def distance_matrix_dados(self): 
        data = self.txt_to_dict()
        ends_destinos = []
        ends_origems = []
        
        for indice, data_end in enumerate(data['C']):
            if data_end['tipo_reg']['valor'] == "D":
                ends_destinos.append(data_end['endereco']['valor'])
            else:
                ends_origems.append(data_end['endereco']['valor'])

        self.ends_destinos = "|".join(ends_destinos);
        self.origems = "|".join(ends_origems)

    def distance_matrix_enviar(self):
        consulta = requests.get(self.url_maps)
        arquivo_saida = ''

        if(consulta.status_code == 200):
            dados = consulta.json()
            # indice_base = 1;

            # for indice, dest in enumerate(dados['rows']):
            #     dados_dest = dados['rows'][indice]['elements']

            #     for indice_el, dest_el in enumerate(dados_dest):

            #         if indice_el == indice_base:
                        
            #             arquivo_saida += "{cod_status}|{msg_status}|{origim}|{dest}|{distance_km}|{distance_number}|{duration_time}|{duration_number}|{status}\n".format(
            #                 cod_status=200,
            #                 msg_status=dados['status'],
            #                 origim=dados['origin_addresses'][indice],
            #                 dest=dados['destination_addresses'][indice_el],
            #                 distance_km=dest_el['distance']['text'],
            #                 distance_number=dest_el['distance']['value'],
            #                 duration_time=dest_el['duration']['text'],
            #                 duration_number=dest_el['duration']['value'],
            #                 status=dest_el['status']
            #             )

            #     indice_base += 1

            for indice, dest in enumerate(dados['destination_addresses']):
                dados_dest = dados['rows'][0]['elements'][indice]

                arquivo_saida += "{cod_status}|{msg_status}|{origim}|{dest}|{distance_km}|{distance_number}|{duration_time}|{duration_number}|{status}\n".format(
                    cod_status=200,
                    msg_status=dados['status'],
                    origim=dados['origin_addresses'][indice],
                    dest=dest,
                    distance_km=dados_dest['distance']['text'],
                    distance_number=dados_dest['distance']['value'],
                    duration_time=dados_dest['duration']['text'],
                    duration_number=dados_dest['duration']['value'],
                    status=dados_dest['status']
                )
        else:
            arquivo_saida = "{}|{}".format(consulta.status_code, "ERRO DE COMUNICAÇÃO")

        with open(self.saida_cobol, 'w') as arquivo:
            arquivo.write(arquivo_saida)

        print('Fim')