#!/usr/bin/env python
# -*- coding: utf-8 -*-
from datetime import datetime
import logging
import re

from lxml.html import fromstring
import requests

logger = logging.getLogger(__name__)
_notfound_key = '__notfound__'


class CepTracker(object):

    def __init__(self):
        self.url = "http://www.buscacep.correios.com.br/sistemas/buscacep/resultadoBuscaCepEndereco.cfm?t"  # NOQA

    def _request(self, cep):
        response = requests.post(self.url, data={
            "relaxation": cep,
            "Metodo": "listaLogradouro",
            "TipoConsulta": "relaxation",
            "StartRow": 1,
            "EndRow": 10,
        }, timeout=10)
        try:
            response.raise_for_status()
        except requests.exceptions.HTTPError as ex:
            logger.exception('Erro no site dos Correios')
            raise ex
        return response.text

    def _get_infos_(self, cep):
        response = self._request(cep)
        html = fromstring(response)
        registros = html.cssselect('.tmptabela tr')

        if not registros:
            return None, []

        header = [h.text.strip(':') for h in registros[0].cssselect('th')]
        registros = registros[1:]
        resultado = []
        for item in registros:
            resultado.append([a.text for a in item.cssselect('td')])

        return header, resultado

    def track(self, cep):
        header, resultado = self._get_infos_(cep)
        result = []

        found = False
        now = datetime.now()

        for item in resultado:
            data = {
                "_meta": {
                    "v_date": now,
                }
            }

            for label, value in zip(header, item):

                label = label.lower().strip()
                value = re.sub('\s+', ' ', value.strip())

                if 'localidade' in label:
                    cidade, estado = value.split('/', 1)
                    data['cidade'] = cidade.strip()
                    data['estado'] = estado.split('-')[0].strip()
                elif 'logradouro' in label:
                    if ' - ' in value:
                        logradouro, complemento = value.split(' - ', 1)
                        data['complemento'] = complemento.strip(' -')
                    else:
                        logradouro = value
                    logradouro = logradouro.strip()
                    if logradouro:
                        data['logradouro'] = logradouro
                elif label == u'endereço':
                    # Use sempre a key `endereco`. O `endereço` existe para não
                    # quebrar clientes existentes. #92
                    data['endereco'] = data[label] = value
                elif 'bairro' in label:
                    data['bairro'] = value
                elif 'cep' in label:
                    _cep = value.replace('-', '')
                    if _cep == cep:
                        found = True
                    data['cep'] = _cep
                else:
                    data[label] = value

            result.append(data)

        if not found:
            result.append({
                'cep': cep,
                '_meta': {
                    "v_date": now,
                    _notfound_key: True,
                },
            })
        return result