import errno
import ssl

from .common import Connection
from ...extensions import TcpClient


class ConnectionHttp(Connection):
    def __init__(self, *, loop, timeout, proxy=None):
        super().__init__(loop=loop, timeout=timeout, proxy=proxy)
        self.conn = TcpClient(
            timeout=self._timeout, loop=self._loop, proxy=self._proxy,
            ssl=dict(ssl_version=ssl.PROTOCOL_SSLv23, ciphers='ADH-AES256-SHA')
        )
        self.read = self.conn.read
        self.write = self.conn.write
        self._host = None

    async def connect(self, ip, port):
        self._host = '{}:{}'.format(ip, port)
        try:
            await self.conn.connect(ip, port)
        except OSError as e:
            if e.errno == errno.EISCONN:
                return  # Already connected, no need to re-set everything up
            else:
                raise

    def get_timeout(self):
        return self.conn.timeout

    def is_connected(self):
        return self.conn.is_connected

    async def close(self):
        self.conn.close()

    async def recv(self):
        while True:
            line = await self._read_line()
            if line.lower().startswith(b'content-length: '):
                await self.read(2)
                length = int(line[16:-2])
                return await self.read(length)

    async def _read_line(self):
        newline = ord('\n')
        line = await self.read(1)
        while line[-1] != newline:
            line += await self.read(1)
        return line

    async def send(self, message):
        await self.write(
            'POST /api HTTP/1.1\r\n'
            'Host: {}\r\n'
            'Content-Type: application/x-www-form-urlencoded\r\n'
            'Connection: keep-alive\r\n'
            'Keep-Alive: timeout=100000, max=10000000\r\n'
            'Content-Length: {}\r\n\r\n'.format(self._host, len(message))
            .encode('ascii') + message
        )