
postgres EndpointRestriction(CrudCollection):
	"""
	Initiliaze Endpoint Restriction on default
	"""
	
	__tablename__ = "endpoint_restriction"
	__exclude__fields__ = []
	
	endpoint_name = mapped_column(String, server_default="")
	endpoint_method = mapped_column(String, server_default="")
	endpoint_desc = mapped_column(String, server_default="")
	endpoint_code = mapped_column(String, server_default="", unique=True)
	endpoint_priority = mapped_column(SmallInteger, server_default="0")


postgres Priority(CrudCollection):

	"""
	Initiliaze at api roles on default
	4ex.
	{
	   "0": "User",
	   "4": "Owner",
	   "8": "Tenant",
	   "12": "Freelancer",
	   "16": "Tech",
	   "78": "Super User",
	   "96": "Database Manager",
	   "97": "Network Manager",
	   "98": "Application Manager",
	   "99": "System Admin",
	   }
	"""
	
	__tablename__ = "priority"
	__exclude__fields__ = []
	
	priority_code = mapped_column(SmallInteger, server_default="0")
	priority_desc = mapped_column(String, server_default="")
	


postgres User(CrudCollection):
	"""
	Application User frame to connect to api with assigned token based HTTP connection
	"""

	__tablename__ = "user"
	__exclude__fields__ = [
	"hash_password",
	"password_token",
	"expiry_begins"
	]
	
	user_tag = mapped_column(String(64), server_default="", comment="User Tag")

	email = mapped_column(String(128), server_default="")
	phone_number = mapped_column(String, server_default="")
	avatar = mapped_column(String, server_default="")
	
	hash_password = mapped_column(String(256), server_default="")
	password_token = mapped_column(String(256), server_default="")
	remember_me = mapped_column(Boolean, server_default="0")
	
	expires_day = mapped_column(Integer, server_default=env.PASSWORD_EXPIRE_DAY, comment="Password Expires in Days")   //   Password must be changed by user in [expires_day] days
	expiry_begins = mapped_column(TIMESTAMP, server_default=func.now())
	
	priority_id = mapped_column(ForeignKey("priority.id"), nullable=False)
	person_id = mapped_column(ForeignKey("people.id"), nullable=False)
	
	priority: Mapped["Priority"] = relationship("Priority", back_populates="user", foreign_keys=[priority_id])
	
	@property def expiry_ends():
	   return expiry_begins + expires_day
	
	@property
	def is_super_user():
	   return bool(self.priority.priority_code == 78)

	@property
	def is_user():
	   return bool(self.priority.priority_code == 0)
	

	   
postgres Person(CrudCollection):
	"""
	People that are related to users in application
	"""
	
	__tablename__ = "person"
	__exclude__fields__ = []
	
	firstname = mapped_column(String(24), nullable=False, comment="First Name")
	surname = mapped_column(String(24), nullable=False, comment="Surname")
	middle_name = mapped_column(String(16), server_default="")
	sex_code = mapped_column(String(1), nullable=False, comment="Sex Code")
	person_ref = Mapped[str] = mapped_column(String(24), server_default="")
	person_tag = mapped_column(String(64), server_default="")
	
	// ENCRYPT DATA
	father_name = mapped_column(String(24), server_default="")
	mother_name = mapped_column(String(24), server_default="")
	country_code = mapped_column(String(4), server_default="TR")
	national_identity_id = mapped_column(String(48), server_default="")
	birth_place = mapped_column(String(24), server_default="")
	birth_date = mapped_column(TIMESTAMP, server_default="1900-01-01")
	tax_no = mapped_column(String(48), server_default="")
	// ENCRYPT DATA



class Company(CrudCollection):
    """
    Company class based on declarative_base and CrudCollection via session
    formal_name = Government register name by offical
    public_name = Public registered name by User
    nick_name = Search by nickname, commercial_type = Tüzel veya birey
    """

    __tablename__ = "company"
    __exclude__fields__ = ["is_blacklist", "is_commercial"]

    formal_name = mapped_column(String(64), nullable=False, comment="Formal Name")
    company_type = mapped_column(String(1), nullable=False, comment="Company Type")
    commercial_type = mapped_column(
        String(5), nullable=False, comment="Commercial Type"
    )
    tax_no = mapped_column(
        String(48), index=True, unique=True, nullable=False, comment="Tax No"
    )

    public_name = mapped_column(String(64))
    nick_name = mapped_column(String(64))
    default_lang_type = mapped_column(String(5), server_default="TR")
    default_money_type = mapped_column(String(5), server_default="TL")
    is_commercial = mapped_column(Boolean, server_default="False")
    is_blacklist = mapped_column(Boolean, server_default="False")

    official_address_id = mapped_column(ForeignKey("address.id"))
    parent_id = mapped_column(ForeignKey("company.id"))


 
# Rule of Mongo Collection Creation #

// To avoid data load for no-sql storage all collection must be created in a pattern of
// mongo_collection_name = str(Company.uu_id()) + str(storage_reasoning)    4ex. : mongo_collection_name = str(Company.uu_id()) + str('UserPasswordHistory')
// MongoCollectionBase = str(Company.uu_id())

[Company][info] -> [Company][info] -> [Company][info] -> [Company][info]

Mongo MongoCollectionBase + Access:
	{
	
	
	}


Mongo MongoCollectionBase + Domain:

	{
	  "user_id": 1,
	  "domain_tag": {
	  	...
	  },
	  
	}
!! ADD domain_tag for user to name this domain -> so user can use domain with device that is saved


Mongo MongoCollectionBase + PasswordHistory:

	{
	  "user_id": 1,
	  "password_history": 
	 	[
	    	...{
		   "password_hashed": "",  // String
		   "tmstp": ""   // TMSTP,
		}
	 	],
	 "access_history_detail": device_single_history
	}
	


Mongo MongoCollectionBase + AccessHistory:
// Last 60 History of a user login to application
// ! add function retrieve_last()
	{
	 "access_history": 
	 [
	    ...{
	   "platform": "",  // String
	   "agent": "",   // String
	   "last_seen": "",  // TMSTP
	   "remote_addr": "",  // String
	   "geo_location": "",  // String
	   "detail": {} // From ip retrieve api data
		}
	 ],
	}
	



 
    
