"""
Enum values for psycopg

These values are defined by us and are not necessarily dependent on
libpq-defined enums.
"""

# Copyright (C) 2020 The Psycopg Team

from enum import Enum, IntEnum
from selectors import EVENT_READ, EVENT_WRITE

from . import pq


class Wait(IntEnum):
    R = EVENT_READ
    W = EVENT_WRITE
    RW = EVENT_READ | EVENT_WRITE


class Ready(IntEnum):
    R = EVENT_READ
    W = EVENT_WRITE
    RW = EVENT_READ | EVENT_WRITE


class PyFormat(str, Enum):
    """
    Enum representing the format wanted for a query argument.

    The value `AUTO` allows psycopg to choose the best format for a certain
    parameter.
    """

    __module__ = "psycopg.adapt"

    AUTO = "s"
    """Automatically chosen (``%s`` placeholder)."""
    TEXT = "t"
    """Text parameter (``%t`` placeholder)."""
    BINARY = "b"
    """Binary parameter (``%b`` placeholder)."""

    @classmethod
    def from_pq(cls, fmt: pq.Format) -> "PyFormat":
        return _pg2py[fmt]

    @classmethod
    def as_pq(cls, fmt: "PyFormat") -> pq.Format:
        return _py2pg[fmt]


class IsolationLevel(IntEnum):
    """
    Enum representing the isolation level for a transaction.
    """

    __module__ = "psycopg"

    READ_UNCOMMITTED = 1
    """:sql:`READ UNCOMMITTED` isolation level."""
    READ_COMMITTED = 2
    """:sql:`READ COMMITTED` isolation level."""
    REPEATABLE_READ = 3
    """:sql:`REPEATABLE READ` isolation level."""
    SERIALIZABLE = 4
    """:sql:`SERIALIZABLE` isolation level."""


_py2pg = {
    PyFormat.TEXT: pq.Format.TEXT,
    PyFormat.BINARY: pq.Format.BINARY,
}

_pg2py = {
    pq.Format.TEXT: PyFormat.TEXT,
    pq.Format.BINARY: PyFormat.BINARY,
}
