-- Copyright (c) 2017 Uber Technologies, Inc.
--
-- Permission is hereby granted, free of charge, to any person obtaining a copy
-- of this software and associated documentation files (the "Software"), to deal
-- in the Software without restriction, including without limitation the rights
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-- copies of the Software, and to permit persons to whom the Software is
-- furnished to do so, subject to the following conditions:
--
-- The above copyright notice and this permission notice shall be included in
-- all copies or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-- THE SOFTWARE.

module Database.Sql.Presto.Token where

import           Data.Text.Lazy (Text)
import           Data.ByteString.Lazy (ByteString)
import qualified Data.Map as M

data Token = TokWord !Bool !Text
           | TokString !ByteString
           | TokBinary !ByteString
           | TokNumber !Text
           | TokSymbol !Text
           | TokError !String
             deriving (Show, Eq)

data WordInfo = WordInfo
              { wordCanBeSchemaName :: !Bool
              , wordCanBeTableName :: !Bool
              , wordCanBeColumnName :: !Bool
              , wordCanBeFunctionName :: !Bool
              }

wordInfo :: Text -> WordInfo
wordInfo word = maybe (WordInfo True True True True) id $ M.lookup word $ M.fromList
    [ ("all",               WordInfo False False False False)
    , ("alter",             WordInfo False False False False)
    , ("and",               WordInfo False False False False)
    , ("any",               WordInfo False False False False)
    , ("as",                WordInfo False False False False)
    , ("asc",               WordInfo False False False False)
    , ("between",           WordInfo False False False False)
    , ("by",                WordInfo False False False False)
    , ("case",              WordInfo False False False False)
    , ("cast",              WordInfo False False False False)
    , ("constraint",        WordInfo False False False False)
    , ("create",            WordInfo False False False False)
    , ("cross",             WordInfo False False False False)
    , ("cube",              WordInfo False False False False)
    , ("current_date",      WordInfo False False False False)
    , ("current_time",      WordInfo False False False False)
    , ("current_timestamp", WordInfo False False False False)
    , ("deallocate",        WordInfo False False False False)
    , ("delete",            WordInfo False False False False)
    , ("desc",              WordInfo False False False False)
    , ("describe",          WordInfo False False False False)
    , ("distinct",          WordInfo False False False False)
    , ("drop",              WordInfo False False False False)
    , ("else",              WordInfo False False False False)
    , ("end",               WordInfo False False False False)
    , ("escape",            WordInfo False False False False)
    , ("except",            WordInfo False False False False)
    , ("execute",           WordInfo False False False False)
    , ("exists",            WordInfo False False False False)
    , ("extract",           WordInfo False False False False)
    , ("false",             WordInfo False False False False)
    , ("first",             WordInfo False False False False)
    , ("for",               WordInfo False False False False)
    , ("from",              WordInfo False False False False)
    , ("full",              WordInfo False False False False)
    , ("group",             WordInfo False False False False)
    , ("grouping",          WordInfo False False False False)
    , ("having",            WordInfo False False False False)
    , ("in",                WordInfo False False False False)
    , ("inner",             WordInfo False False False False)
    , ("insert",            WordInfo False False False False)
    , ("intersect",         WordInfo False False False False)
    , ("into",              WordInfo False False False False)
    , ("is",                WordInfo False False False False)
    , ("join",              WordInfo False False False False)
    , ("last",              WordInfo False False False False)
    , ("left",              WordInfo False False False False)
    , ("like",              WordInfo False False False False)
    , ("limit",             WordInfo False False False False)
    , ("localtime",         WordInfo False False False False)
    , ("localtimestamp",    WordInfo False False False False)
    , ("natural",           WordInfo False False False False)
    , ("normalize",         WordInfo False False False False)
    , ("not",               WordInfo False False False False)
    , ("null",              WordInfo False False False False)
    , ("nulls",             WordInfo False False False False)
    , ("on",                WordInfo False False False False)
    , ("or",                WordInfo False False False False)
    , ("order",             WordInfo False False False False)
    , ("ordinality",        WordInfo False False False False)
    , ("outer",             WordInfo False False False False)
    , ("prepare",           WordInfo False False False False)
    , ("recursive",         WordInfo False False False False)
    , ("rename",            WordInfo False False False False)
    , ("right",             WordInfo False False False False)
    , ("rollup",            WordInfo False False False False)
    , ("select",            WordInfo False False False False)
    , ("sets",              WordInfo False False False False)
    , ("some",              WordInfo False False False False)
    , ("table",             WordInfo False False False False)
    , ("then",              WordInfo False False False False)
    , ("true",              WordInfo False False False False)
    , ("try_cast",          WordInfo False False False False)
    , ("unbounded",         WordInfo False False False False)
    , ("union",             WordInfo False False False False)
    , ("unnest",            WordInfo False False False False)
    , ("using",             WordInfo False False False False)
    , ("values",            WordInfo False False False False)
    , ("when",              WordInfo False False False False)
    , ("where",             WordInfo False False False False)
    , ("with",              WordInfo False False False False)
    ]