{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Database.PostgreSQL.Pure.Oid
  ( Oid (Oid)
  , _daterange
  , _int4range
  , _int8range
  , _numrange
  , _tsrange
  , _tstzrange
  , bit
  , bitArray
  , bool
  , boolArray
  , box
  , boxArray
  , bpchar
  , bpcharArray
  , bytea
  , byteaArray
  , char
  , charArray
  , cid
  , cidArray
  , cidr
  , cidrArray
  , circle
  , circleArray
  , date
  , dateArray
  , daterange
  , float4
  , float4Array
  , float8
  , float8Array
  , inet
  , inetArray
  , int2
  , int2Array
  , int2vector
  , int2vectorArray
  , int4
  , int4Array
  , int4range
  , int8
  , int8Array
  , int8range
  , interval
  , intervalArray
  , json
  , jsonArray
  , jsonb
  , jsonbArray
  , line
  , lineArray
  , lseg
  , lsegArray
  , macaddr
  , macaddrArray
  , money
  , moneyArray
  , name
  , nameArray
  , numeric
  , numericArray
  , numrange
  , oid
  , oidArray
  , oidvector
  , oidvectorArray
  , path
  , pathArray
  , point
  , pointArray
  , polygon
  , polygonArray
  , record
  , recordArray
  , refcursor
  , refcursorArray
  , regclass
  , regclassArray
  , regoper
  , regoperArray
  , regoperator
  , regoperatorArray
  , regproc
  , regprocArray
  , regprocedure
  , regprocedureArray
  , regtype
  , regtypeArray
  , sqlIdentifier
  , text
  , textArray
  , tid
  , tidArray
  , time
  , timeArray
  , timestamp
  , timestampArray
  , timestamptz
  , timestamptzArray
  , timetz
  , timetzArray
  , tsrange
  , tstzrange
  , unknown
  , uuid
  , uuidArray
  , varbit
  , varbitArray
  , varchar
  , varcharArray
  , void
  , xid
  , xidArray
  , xml
  , xmlArray
  ) where

import           Control.Applicative (Alternative ((<|>)))
import           Data.Int            (Int32)
import           Text.Read           (Read (readPrec))
import qualified Text.Read           as R
import qualified Text.Read.Lex       as R

-- | OID.
--
-- Constant values are listed in @Database.PostgreSQL.Pure.Oid@.
newtype Oid = Oid Int32 deriving (Eq, Num)

bool :: Oid
bool = 16

bytea :: Oid
bytea = 17

char :: Oid
char = 18

name :: Oid
name = 19

int8 :: Oid
int8 = 20

int2 :: Oid
int2 = 21

int4 :: Oid
int4 = 23

regproc :: Oid
regproc = 24

text :: Oid
text = 25

oid :: Oid
oid = 26

tid :: Oid
tid = 27

xid :: Oid
xid = 28

cid :: Oid
cid = 29

xml :: Oid
xml = 142

point :: Oid
point = 600

lseg :: Oid
lseg = 601

path :: Oid
path = 602

box :: Oid
box = 603

polygon :: Oid
polygon = 604

line :: Oid
line = 628

cidr :: Oid
cidr = 650

float4 :: Oid
float4 = 700

float8 :: Oid
float8 = 701

unknown :: Oid
unknown = 705

circle :: Oid
circle = 718

money :: Oid
money = 790

macaddr :: Oid
macaddr = 829

inet :: Oid
inet = 869

bpchar :: Oid
bpchar = 1042

varchar :: Oid
varchar = 1043

date :: Oid
date = 1082

time :: Oid
time = 1083

timestamp :: Oid
timestamp = 1114

timestamptz :: Oid
timestamptz = 1184

interval :: Oid
interval = 1186

timetz :: Oid
timetz = 1266

bit :: Oid
bit = 1560

varbit :: Oid
varbit = 1562

numeric :: Oid
numeric = 1700

refcursor :: Oid
refcursor = 1790

record :: Oid
record = 2249

void :: Oid
void = 2278

recordArray :: Oid
recordArray = 2287

regprocedure :: Oid
regprocedure = 2202

regoper :: Oid
regoper = 2203

regoperator :: Oid
regoperator = 2204

regclass :: Oid
regclass = 2205

regtype :: Oid
regtype = 2206

uuid :: Oid
uuid = 2950

json :: Oid
json = 114

jsonb :: Oid
jsonb = 3802

int2vector :: Oid
int2vector = 22

oidvector :: Oid
oidvector = 30

xmlArray :: Oid
xmlArray = 143

jsonArray :: Oid
jsonArray = 199

lineArray :: Oid
lineArray = 629

cidrArray :: Oid
cidrArray = 651

circleArray :: Oid
circleArray = 719

moneyArray :: Oid
moneyArray = 791

boolArray :: Oid
boolArray = 1000

byteaArray :: Oid
byteaArray = 1001

charArray :: Oid
charArray = 1002

nameArray :: Oid
nameArray = 1003

int2Array :: Oid
int2Array = 1005

int2vectorArray :: Oid
int2vectorArray = 1006

int4Array :: Oid
int4Array = 1007

regprocArray :: Oid
regprocArray = 1008

textArray :: Oid
textArray = 1009

tidArray :: Oid
tidArray = 1010

xidArray :: Oid
xidArray = 1011

cidArray :: Oid
cidArray = 1012

oidvectorArray :: Oid
oidvectorArray = 1013

bpcharArray :: Oid
bpcharArray = 1014

varcharArray :: Oid
varcharArray = 1015

int8Array :: Oid
int8Array = 1016

pointArray :: Oid
pointArray = 1017

lsegArray :: Oid
lsegArray = 1018

pathArray :: Oid
pathArray = 1019

boxArray :: Oid
boxArray = 1020

float4Array :: Oid
float4Array = 1021

float8Array :: Oid
float8Array = 1022

polygonArray :: Oid
polygonArray = 1027

oidArray :: Oid
oidArray = 1028

macaddrArray :: Oid
macaddrArray = 1040

inetArray :: Oid
inetArray = 1041

timestampArray :: Oid
timestampArray = 1115

dateArray :: Oid
dateArray = 1182

timeArray :: Oid
timeArray = 1183

timestamptzArray :: Oid
timestamptzArray = 1185

intervalArray :: Oid
intervalArray = 1187

numericArray :: Oid
numericArray = 1231

timetzArray :: Oid
timetzArray = 1270

bitArray :: Oid
bitArray = 1561

varbitArray :: Oid
varbitArray = 1563

refcursorArray :: Oid
refcursorArray = 2201

regprocedureArray :: Oid
regprocedureArray = 2207

regoperArray :: Oid
regoperArray = 2208

regoperatorArray :: Oid
regoperatorArray = 2209

regclassArray :: Oid
regclassArray = 2210

regtypeArray :: Oid
regtypeArray = 2211

uuidArray :: Oid
uuidArray = 2951

jsonbArray :: Oid
jsonbArray = 3807

int4range :: Oid
int4range = 3904

_int4range :: Oid
_int4range = 3905

numrange :: Oid
numrange = 3906

_numrange :: Oid
_numrange = 3907

tsrange :: Oid
tsrange = 3908

_tsrange :: Oid
_tsrange = 3909

tstzrange :: Oid
tstzrange = 3910

_tstzrange :: Oid
_tstzrange = 3911

daterange :: Oid
daterange = 3912

_daterange :: Oid
_daterange = 3913

int8range :: Oid
int8range = 3926

_int8range :: Oid
_int8range = 3927

sqlIdentifier :: Oid
sqlIdentifier = 12664

instance Show Oid where
  show o | o == bool = "bool"
         | o == bytea = "bytea"
         | o == char = "char"
         | o == name = "name"
         | o == int8 = "int8"
         | o == int2 = "int2"
         | o == int4 = "int4"
         | o == regproc = "regproc"
         | o == text = "text"
         | o == oid = "oid"
         | o == tid = "tid"
         | o == xid = "xid"
         | o == cid = "cid"
         | o == xml = "xml"
         | o == point = "point"
         | o == lseg = "lseg"
         | o == path = "path"
         | o == box = "box"
         | o == polygon = "polygon"
         | o == line = "line"
         | o == cidr = "cidr"
         | o == float4 = "float4"
         | o == float8 = "float8"
         | o == unknown = "unknown"
         | o == circle = "circle"
         | o == money = "money"
         | o == macaddr = "macaddr"
         | o == inet = "inet"
         | o == bpchar = "bpchar"
         | o == varchar = "varchar"
         | o == date = "date"
         | o == time = "time"
         | o == timestamp = "timestamp"
         | o == timestamptz = "timestamptz"
         | o == interval = "interval"
         | o == timetz = "timetz"
         | o == bit = "bit"
         | o == varbit = "varbit"
         | o == numeric = "numeric"
         | o == refcursor = "refcursor"
         | o == record = "record"
         | o == void = "void"
         | o == recordArray = "recordArray"
         | o == regprocedure = "regprocedure"
         | o == regoper = "regoper"
         | o == regoperator = "regoperator"
         | o == regclass = "regclass"
         | o == regtype = "regtype"
         | o == uuid = "uuid"
         | o == json = "json"
         | o == jsonb = "jsonb"
         | o == int2vector = "int2vector"
         | o == oidvector = "oidvector"
         | o == xmlArray = "xmlArray"
         | o == jsonArray = "jsonArray"
         | o == lineArray = "lineArray"
         | o == cidrArray = "cidrArray"
         | o == circleArray = "circleArray"
         | o == moneyArray = "moneyArray"
         | o == boolArray = "boolArray"
         | o == byteaArray = "byteaArray"
         | o == charArray = "charArray"
         | o == nameArray = "nameArray"
         | o == int2Array = "int2Array"
         | o == int2vectorArray = "int2vectorArray"
         | o == int4Array = "int4Array"
         | o == regprocArray = "regprocArray"
         | o == textArray = "textArray"
         | o == tidArray = "tidArray"
         | o == xidArray = "xidArray"
         | o == cidArray = "cidArray"
         | o == oidvectorArray = "oidvectorArray"
         | o == bpcharArray = "bpcharArray"
         | o == varcharArray = "varcharArray"
         | o == int8Array = "int8Array"
         | o == pointArray = "pointArray"
         | o == lsegArray = "lsegArray"
         | o == pathArray = "pathArray"
         | o == boxArray = "boxArray"
         | o == float4Array = "float4Array"
         | o == float8Array = "float8Array"
         | o == polygonArray = "polygonArray"
         | o == oidArray = "oidArray"
         | o == macaddrArray = "macaddrArray"
         | o == inetArray = "inetArray"
         | o == timestampArray = "timestampArray"
         | o == dateArray = "dateArray"
         | o == timeArray = "timeArray"
         | o == timestamptzArray = "timestamptzArray"
         | o == intervalArray = "intervalArray"
         | o == numericArray = "numericArray"
         | o == timetzArray = "timetzArray"
         | o == bitArray = "bitArray"
         | o == varbitArray = "varbitArray"
         | o == refcursorArray = "refcursorArray"
         | o == regprocedureArray = "regprocedureArray"
         | o == regoperArray = "regoperArray"
         | o == regoperatorArray = "regoperatorArray"
         | o == regclassArray = "regclassArray"
         | o == regtypeArray = "regtypeArray"
         | o == uuidArray = "uuidArray"
         | o == jsonbArray = "jsonbArray"
         | o == int4range = "int4range"
         | o == _int4range = "_int4range"
         | o == numrange = "numrange"
         | o == _numrange = "_numrange"
         | o == tsrange = "tsrange"
         | o == _tsrange = "_tsrange"
         | o == tstzrange = "tstzrange"
         | o == _tstzrange = "_tstzrange"
         | o == daterange = "daterange"
         | o == _daterange = "_daterange"
         | o == int8range = "int8range"
         | o == _int8range = "_int8range"
         | o == sqlIdentifier = "sqlIdentifier"
  show (Oid n) = show n

instance Read Oid where
  readPrec =
    R.parens
        ( do
            R.lift $ R.expect $ R.Ident "bool"
            pure bool
        )
        <|> ( do
                R.lift $ R.expect $ R.Ident "bytea"
                pure bytea
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "char"
                pure char
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "name"
                pure name
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "int8"
                pure int8
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "int2"
                pure int2
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "int4"
                pure int4
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "regproc"
                pure regproc
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "text"
                pure text
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "oid"
                pure oid
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "tid"
                pure tid
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "xid"
                pure xid
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "cid"
                pure cid
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "xml"
                pure xml
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "point"
                pure point
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "lseg"
                pure lseg
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "path"
                pure path
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "box"
                pure box
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "polygon"
                pure polygon
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "line"
                pure line
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "cidr"
                pure cidr
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "float4"
                pure float4
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "float8"
                pure float8
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "unknown"
                pure unknown
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "circle"
                pure circle
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "money"
                pure money
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "macaddr"
                pure macaddr
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "inet"
                pure inet
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "bpchar"
                pure bpchar
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "varchar"
                pure varchar
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "date"
                pure date
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "time"
                pure time
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "timestamp"
                pure timestamp
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "timestamptz"
                pure timestamptz
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "interval"
                pure interval
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "timetz"
                pure timetz
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "bit"
                pure bit
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "varbit"
                pure varbit
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "numeric"
                pure numeric
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "refcursor"
                pure refcursor
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "record"
                pure record
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "void"
                pure void
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "recordArray"
                pure recordArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "regprocedure"
                pure regprocedure
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "regoper"
                pure regoper
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "regoperator"
                pure regoperator
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "regclass"
                pure regclass
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "regtype"
                pure regtype
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "uuid"
                pure uuid
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "json"
                pure json
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "jsonb"
                pure jsonb
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "int2vector"
                pure int2vector
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "oidvector"
                pure oidvector
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "xmlArray"
                pure xmlArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "jsonArray"
                pure jsonArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "lineArray"
                pure lineArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "cidrArray"
                pure cidrArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "circleArray"
                pure circleArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "moneyArray"
                pure moneyArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "boolArray"
                pure boolArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "byteaArray"
                pure byteaArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "charArray"
                pure charArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "nameArray"
                pure nameArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "int2Array"
                pure int2Array
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "int2vectorArray"
                pure int2vectorArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "int4Array"
                pure int4Array
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "regprocArray"
                pure regprocArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "textArray"
                pure textArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "tidArray"
                pure tidArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "xidArray"
                pure xidArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "cidArray"
                pure cidArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "oidvectorArray"
                pure oidvectorArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "bpcharArray"
                pure bpcharArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "varcharArray"
                pure varcharArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "int8Array"
                pure int8Array
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "pointArray"
                pure pointArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "lsegArray"
                pure lsegArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "pathArray"
                pure pathArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "boxArray"
                pure boxArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "float4Array"
                pure float4Array
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "float8Array"
                pure float8Array
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "polygonArray"
                pure polygonArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "oidArray"
                pure oidArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "macaddrArray"
                pure macaddrArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "inetArray"
                pure inetArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "timestampArray"
                pure timestampArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "dateArray"
                pure dateArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "timeArray"
                pure timeArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "timestamptzArray"
                pure timestamptzArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "intervalArray"
                pure intervalArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "numericArray"
                pure numericArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "timetzArray"
                pure timetzArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "bitArray"
                pure bitArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "varbitArray"
                pure varbitArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "refcursorArray"
                pure refcursorArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "regprocedureArray"
                pure regprocedureArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "regoperArray"
                pure regoperArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "regoperatorArray"
                pure regoperatorArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "regclassArray"
                pure regclassArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "regtypeArray"
                pure regtypeArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "uuidArray"
                pure uuidArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "jsonbArray"
                pure jsonbArray
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "int4range"
                pure int4range
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "_int4range"
                pure _int4range
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "numrange"
                pure numrange
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "_numrange"
                pure _numrange
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "tsrange"
                pure tsrange
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "_tsrange"
                pure _tsrange
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "tstzrange"
                pure tstzrange
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "_tstzrange"
                pure _tstzrange
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "daterange"
                pure daterange
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "_daterange"
                pure _daterange
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "int8range"
                pure int8range
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "_int8range"
                pure _int8range
            )
        <|> ( do
                R.lift $ R.expect $ R.Ident "sqlIdentifier"
                pure sqlIdentifier
            )
        <|> (Oid <$> readPrec)