/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
**********************************************************************/

#ifndef _CMP_SEABASE_DDL_AUTH_H_
#define _CMP_SEABASE_DDL_AUTH_H_

// *****************************************************************************
// *
// * File:         CmpSeabaseDDLauth.h
// * Description:  Describes the DDL classes for Trafodion user management
// *               
// * Contents:
// *   class CmpSeabaseDDLauth   
// *   class CmpSeabaseDDLuser
// *
// *****************************************************************************

#include "ComSmallDefs.h"
#include "PrivMgrDefs.h"
#include "PrivMgrComponentDefs.h"
#include "NAUserId.h"
#include <vector>


class StmtDDLRegisterUser;
class StmtDDLAlterUser;
class StmtDDLCreateRole;
class NAString;

// ----------------------------------------------------------------------------
// class:  CmpSeabaseDDLauth
//
// User management class defining commonality between all authorization IDs
// Authorization IDs consist of users, PUBLIC(TDB), roles(TBD), and groups(TBD)
// ----------------------------------------------------------------------------

class CmpSeabaseDDLauth  
{

   public:

     enum AuthStatus { STATUS_UNKNOWN   = 10,
                       STATUS_GOOD      = 11,
                       STATUS_WARNING   = 12,
                       STATUS_NOTFOUND  = 13,
                       STATUS_ERROR     = 14 };
                       
     CmpSeabaseDDLauth();
     CmpSeabaseDDLauth(
        const NAString & systemCatalog,
        const NAString & MDSchema);

     AuthStatus   getAuthDetails (const char *pAuthName, 
                                    bool isExternal = false);
     AuthStatus   getAuthDetails (Int32 authID);
     bool         authExists     (const NAString &authName, 
                                    bool isExternal = false);
     virtual bool describe       (const NAString &authName, 
                                    NAString &authText);
     AuthStatus   getRoleIDs     (const Int32 authID,
                                    std::vector<int32_t> &roleIDs);
     NAString     getObjectName  (const std::vector <int64_t> objectUIDs);

     // accessors
     Int32          getAuthCreator() const    { return authCreator_; }
     Int64          getAuthCreateTime() const { return authCreateTime_;}
     const NAString getAuthDbName() const     { return authDbName_; }
     const NAString getAuthExtName() const    { return authExtName_; }
     Int32          getAuthID() const         { return authID_; }
     Int64          getAuthRedefTime() const  { return authRedefTime_; }
     ComIdClass     getAuthType() const       { return authType_; }

     bool  isAuthValid() const     { return authValid_; }
     bool  isPublic() const        { return authID_ == PUBLIC_USER; }
     bool  isRole()   const        { return authType_ == COM_ROLE_CLASS; }
     bool  isUser()   const        { return authType_ == COM_USER_CLASS; }
     bool  isSystemAuth(
       const ComIdClass authType,
       const NAString &authName,
       bool &specialAuth);

     static bool isRoleID(Int32 authID); 
     static bool isUserID(Int32 authID); 

 protected:

    bool isAuthNameReserved (const NAString &authName);
    bool isAuthNameValid    (const NAString &authName);

    Int32 getUniqueAuthID (const Int32 minValue, const Int32 maxValue);

    // mutators
    void setAuthCreator      (const Int32 authCreator)
      {authCreator_ = authCreator;}
    void setAuthCreateTime   (const Int64 authCreateTime)
      { authCreateTime_ = authCreateTime;}
    void setAuthDbName       (const NAString &authDbName)
      {authDbName_=authDbName;}
    void setAuthExtName      (const NAString &authExtName)
      {authExtName_=authExtName;}
    void setAuthID           (const Int32 authID)
      {authID_ = authID;}
     void setAuthRedefTime    (const Int64 authRedefTime)
       { authRedefTime_ = authRedefTime;}
     void setAuthType        (ComIdClass authType)
       {authType_ = authType;}
     void setAuthValid       (bool isValid)
       {authValid_ = isValid;}

     bool createStandardAuth (
        const std::string authName,
        const int32_t authID);

    // metadata access methods
    void deleteRow      (const NAString &authName);
    void insertRow      (void);
    void updateRow      (NAString & setClause);
    AuthStatus selectExactRow (const NAString &cmd); 
    Int64      selectCount    (const NAString & whereClause);
    Int32      selectMaxAuthID(const NAString &whereClause);
    bool       verifyAuthority(const SQLOperation operation);
    
  NAString systemCatalog_;
  NAString MDSchema_; /* Qualified metadata schema */
    

 private:

    Int32             authCreator_;
    Int64             authCreateTime_;
    NAString          authDbName_;
    NAString          authExtName_;
    Int32             authID_;
    Int64             authRedefTime_;
    ComIdClass        authType_;
    bool              authValid_;

};

// ----------------------------------------------------------------------------
// class:  CmpSeabaseDDLuser
//
// Class that manages user authorization IDs
//
// Child class of CmpSeabaseDDLauth
// ----------------------------------------------------------------------------
class CmpSeabaseDDLuser : public CmpSeabaseDDLauth
{
   public:

     CmpSeabaseDDLuser();
     CmpSeabaseDDLuser(
        const NAString & systemCatalog,
        const NAString & MDSchema);

     // Execute level methods
     void alterUser(StmtDDLAlterUser * pNode);
     void registerUser(StmtDDLRegisterUser * pNode);
     void unregisterUser(StmtDDLRegisterUser * pNode);
     void registerStandardUser(
       const std::string userName,
       const int32_t userID);

     CmpSeabaseDDLauth::AuthStatus getUserDetails(const char *pUserName, 
                                                  bool isExternal = false);
     CmpSeabaseDDLauth::AuthStatus getUserDetails(Int32 userID);

     bool describe (const NAString &authName, NAString &authText);

   protected:

};


// ----------------------------------------------------------------------------
// class:  CmpSeabaseDDLrole
//
// Class that manages role authorization IDs
//
// Child class of CmpSeabaseDDLauth
// ----------------------------------------------------------------------------
class CmpSeabaseDDLrole : public CmpSeabaseDDLauth
{
   public:

     CmpSeabaseDDLrole();
     CmpSeabaseDDLrole(const NAString & systemCatalog);
     CmpSeabaseDDLrole(
        const NAString & systemCatalog,
        const NAString & MDSchema);

     void createRole(StmtDDLCreateRole * pNode);
        
     bool createStandardRole(
        const std::string roleName,
        const int32_t roleID);
        
     bool describe(
        const NAString & roleName, 
        NAString & roleText);
     
     void dropRole(StmtDDLCreateRole * pNode);
     
     void dropStandardRole(const std::string roleName);
        
     CmpSeabaseDDLauth::AuthStatus getRoleDetails(const char *pRoleName);
     
     bool getRoleIDFromRoleName(const char * roleName,Int32 &roleID);

   protected:

};

#endif // _CMP_SEABASE_DDL_AUTH_H_
