# -*- coding: utf-8 -*-
import logging
import socket
import threading

from .util import receive_line


class I2PDialer(threading.Thread):
    def __init__(
        self, state, destination, nick, sam_host='127.0.0.1', sam_port=7656
    ):
        self.state = state
        self.sam_host = sam_host
        self.sam_port = sam_port

        self.nick = nick
        self.destination = destination

        super().__init__(name='I2P Dial to {}'.format(self.destination))

        self.s = socket.create_connection((self.sam_host, self.sam_port))

        self.version_reply = []
        self.success = True

    def run(self):
        logging.debug('Connecting to %s', self.destination)
        self._connect()
        if not self.state.shutting_down and self.success:
            c = self.state.connection(
                self.destination, 'i2p', self.s, 'i2p',
                False, self.destination)
            c.start()
            self.state.connections.add(c)

    def _receive_line(self):
        line = receive_line(self.s)
        # logging.debug('I2PDialer <- %s', line)
        return line

    def _send(self, command):
        # logging.debug('I2PDialer -> %s', command)
        self.s.sendall(command)

    def _connect(self):
        self._send(b'HELLO VERSION MIN=3.0 MAX=3.3\n')
        self.version_reply = self._receive_line().split()
        if b'RESULT=OK' not in self.version_reply:
            logging.warning('Error while connecting to %s', self.destination)
            self.success = False

        self._send(
            b'STREAM CONNECT ID=' + self.nick + b' DESTINATION='
            + self.destination + b'\n')
        reply = self._receive_line().split(b' ')
        if b'RESULT=OK' not in reply:
            logging.warning(
                'Error while connecting to %s', self.destination)
            self.success = False
