--------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Gnostic is Ada Generic Neural Object System Engineering.                                                                                                --
-- Gnostic (C) Copyright 2016 Manuel De Girardi.                                                                                                           --
--------------------------------------------------------------------------------------------------------------------------------------------------------------
  
--------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Date        := 2016-12-02 14:09:36 ; 
-- Description : Ada Generic Neural Object System Engineering.                                                                                              --
-- Version     := 2016.27.0a ; 
-- Authors     : Manuel De Girardi.                                                                                                                         --
--------------------------------------------------------------------------------------------------------------------------------------------------------------
package Gnos is

   pragma pure (Gnos);
   
   subtype Name_Type is String(1..1024);
   -- Name is string of 1024 characters.
   
   subtype Version_Type is String(1..128);
   -- Version is string of 128 characters.   
   
   type Project_Type is tagged
      record
	 Name    : Name_Type;
	 Version : Version_Type;
      end record;
   -- Project is a name and version.            
   
   Max_Projects : constant Positive := 128;
   -- Maximum number of project in Adam.Systemic.Project_Set.
   subtype Project_Index_Type is Natural range 1..Max_Projects;
   -- Project_Index is the index of project in Adam.Systemic.Project_Set.
   
   type Project_Set_Type is array (Project_Index_Type range <>) of Project_Type;
   -- Project_Set is positive array of project.   
   subtype Extended_Project_Index_Type is Natural range 0..Project_Index_Type'Last;   
   type Manufacture_Type is
      record
	 Projects : Project_Set_Type(1..Max_Projects);
	 
      end record;   
   
   Bad_Passwd, Already_registered : exception;
   Full_Set, Empty_Set, Project_Not_Match : exception;
   Not_Initialized, Already_Initialized : exception;
   
   -------------------------------------
   -- Used by Timer, Dater and Alarm. --
   -------------------------------------
   subtype Years_Count is Natural range 0..385; -- Max Years of Ada implementation (2399) - Current Year (2015) + 1.
   subtype Months_Count is Natural range 0..11;
   subtype Days_Count is Natural range 0..365;   
     
   -----------------------------------------------------------------
   -- Parameters type definitions :
   
   Name_Length_Max : constant Positive := 1024;
   
   subtype Name_Index_Type is Positive range 1..Name_Length_Max;
   
   Units_Max : constant Positive := 65536;
   
   subtype Unit_Index_Type is Positive range 1..Units_Max;   
   
   Ada_Line_Length_Max : constant Positive := 256;
   
   subtype Char_Index_Type is Positive range 1..Ada_Line_Length_Max;
   
   
   Ada_Version_Max : constant Positive := 2399;
   
   subtype Version_Index_Type is Positive range 1983..Ada_Version_Max;
   
   Objects_Max : constant Positive := 65536;
   
   subtype Object_Index_Type is Positive range 1..Objects_Max;
      
   type Human_Lang_Enum is (En, Fr);
   
   type Machine_Lang_Enum is (Project_Define, Ada_2012, Gtk_Ada, Ada_Web_Server);
         
   type Parameters_Flags_Enum_Type is
     
     (
      Null_Parameter,
      Config_Filename,
      Help,
      Version_Edition,
      Name_Length,
      Unit_Max,
      Char_Max,
      Version,
      Object_Max,
      Self_Programming,
      Self_Executed,
      Self_Wait,
      User_Wait,
      Human_Lang,
      With_Gtk,
      With_Ada,
      With_Aws	
     );
   
   type Parameter_Tagged_Record_Type (Requiered_Parameter : Boolean) is tagged
      record	 
	 Switch   : access Wide_String;	 	 
	 Num_Iter : Natural := 0;	 	 
	 Is_Setted : Boolean := False;	 
	 Parameter_Flag : Parameters_Flags_Enum_Type := Null_Parameter;	 
	 Descr : access Wide_String;	 
	 case Requiered_Parameter is
	    when False =>
	       null;
	    when True =>
	       
	       param : access Wide_String;
	       Value : access Wide_String;
	 end case;
      end record;
      
   type Parameters_Kit_Array_Type is 
     array (Parameters_Flags_Enum_Type) of 
     access Parameter_Tagged_Record_Type;
               
   Line_Parameters : constant Parameters_Kit_Array_Type := 
     (
      
      Null_parameter => null,
      
      Config_Filename => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("F"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Config_Filename, 
	 Descr => new Wide_String ' ("Configuration filename"),
	 Param => new Wide_String ' ("Wide_String"),
	 Value => null),	 
      Help => new Parameter_Tagged_Record_Type '
	(Requiered_Parameter => False, Switch => new Wide_String ' ("h"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => help, 
	 Descr => new Wide_String ' ("print this message")),
      Version_Edition => new Parameter_Tagged_Record_Type '
	(Requiered_Parameter => False, Switch => new Wide_String ' ("v"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Version_Edition, 
	 Descr => new Wide_String ' ("print the edition version")),
      Name_Length => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("n"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Name_Length,
	 Descr => new Wide_String ' ("Name length max"),
	 Param => new Wide_String ' ("Name_Index_Type"),
	 Value => null),
      Unit_Max => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("u"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Unit_Max,
	 Descr => new Wide_String ' ("Units max"),
	 Param => new Wide_String ' ("Unit_Index_Type"),
	 Value => null),
      Char_Max => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("c"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Char_Max,
	 Descr => new Wide_String ' ("Line length max"),
	 Param => new Wide_String ' ("Char_Index_Type"),
	 Value => null),
      Version => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("V"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Version, 
	 Descr => new Wide_String ' ("Language version"),
	 Param => new Wide_String ' ("Version_Index_Type"),
	 Value => null),
      Object_Max => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("o"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Object_Max, 
	 Descr => new Wide_String ' ("Object max"),
	 Param => new Wide_String ' ("Object_index_type"),
	 Value => null),
      Self_Programming => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("p"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Self_Programming,
	 Descr => new Wide_String ' ("Self programming"),
	 Param => new Wide_String ' ("Boolean"),
	 Value => null),
      Self_Executed => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("e"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Self_Executed,
	 Descr => new Wide_String ' ("Self Executed"),
	 Param => new Wide_String ' ("Boolean"),
	 Value => null),
      Self_Wait => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("w"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Self_Wait,
	 Descr => new Wide_String ' ("Self wait"),
	 Param => new Wide_String ' ("Duration"),
	 Value => null),
      User_wait => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("W"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => User_Wait,
	 Descr => new Wide_String ' ("User wait"),
	 Param => new Wide_String ' ("Duration"),
	 Value => null),
      Human_Lang => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("l"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Human_Lang, 
	 Descr => new Wide_String ' ("Human Language I18 abrev"),
	 Param => new Wide_String ' ("Human_Lang_Enum"),
	 Value => null),
      With_Gtk => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("g"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => With_Gtk, 
	 Descr => new Wide_String ' ("with GtkAda"),
	 Param => new Wide_String ' ("Boolean"),
	 Value => null),
      With_Ada => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("a"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => With_Ada, 
	 Descr => new Wide_String ' ("with Ada"),
	 Param => new Wide_String ' ("Boolean"),
	 Value => null),
      With_Aws => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("s"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => With_Aws, 
	 Descr => new Wide_String ' ("with AWS"),
	 Param => new Wide_String ' ("Boolean"),
	 Value => null)
     );
     
   File_Parameters : constant Parameters_Kit_Array_Type := 
     (
      
      Null_parameter => null,
      Config_Filename => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("F"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Config_Filename, 
	 Descr => new Wide_String ' ("Configuration filename"),
	 Param => new Wide_String ' ("Wide_String"),
	 Value => null),
	 
      Help => new Parameter_Tagged_Record_Type '
	(Requiered_Parameter => False, Switch => new Wide_String ' ("h"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => help, 
	 Descr => new Wide_String ' ("print this message")),
      Version_Edition => new Parameter_Tagged_Record_Type '
	(Requiered_Parameter => False, Switch => new Wide_String ' ("v"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Version_Edition, 
	 Descr => new Wide_String ' ("print the edition version")),
      Name_Length => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("n"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Name_Length,
	 Descr => new Wide_String ' ("Name length max"),
	 Param => new Wide_String ' ("Name_Index_Type"),
	 Value => null),
      Unit_Max => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("u"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Unit_Max,
	 Descr => new Wide_String ' ("Units max"),
	 Param => new Wide_String ' ("Unit_Index_Type"),
	 Value => null),
      Char_Max => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("c"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Char_Max,
	 Descr => new Wide_String ' ("Line length max"),
	 Param => new Wide_String ' ("Char_Index_Type"),
	 Value => null),
      Version => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("V"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Version, 
	 Descr => new Wide_String ' ("Language version"),
	 Param => new Wide_String ' ("Version_Index_Type"),
	 Value => null),
      Object_Max => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("o"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Object_Max, 
	 Descr => new Wide_String ' ("Object max"),
	 Param => new Wide_String ' ("Objetcs_index_type"),
	 Value => null),
      Self_Programming => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("p"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Self_Programming,
	 Descr => new Wide_String ' ("Self programming"),
	 Param => new Wide_String ' ("Boolean"),
	 Value => null),
      Self_Executed => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("e"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Self_Executed,
	 Descr => new Wide_String ' ("Self Executed"),
	 Param => new Wide_String ' ("Boolean"),
	 Value => null),
      Self_Wait => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("w"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Self_Wait,
	 Descr => new Wide_String ' ("Self wait"),
	 Param => new Wide_String ' ("Duration"),
	 Value => null),
      User_wait => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("W"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => User_wait, 
	 Descr => new Wide_String ' ("User wait"),
	 Param => new Wide_String ' ("Duration"),
	 Value => null),
      Human_Lang => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("l"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => Human_Lang, 
	 Descr => new Wide_String ' ("Human Language I18 abrev"),
	 Param => new Wide_String ' ("Human_Lang_Enum"),
	 Value => null),
      With_Gtk => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("g"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => With_Gtk, 
	 Descr => new Wide_String ' ("with GtkAda"),
	 Param => new Wide_String ' ("Boolean"),
	 Value => null),
      With_Ada => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("a"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => With_Ada, 
	 Descr => new Wide_String ' ("with Ada"),
	 Param => new Wide_String ' ("Boolean"),
	 Value => null),
      With_Aws => new Parameter_Tagged_Record_Type ' 
	(Requiered_Parameter => True, Switch => new Wide_String ' ("s"), Num_Iter => 0,
	 Is_Setted => False, Parameter_Flag => With_Aws, 
	 Descr => new Wide_String ' ("with AWS"),
	 Param => new Wide_String ' ("Boolean"),
	 Value => null)
     );
      
   
   type Abstract_Parameters_Type is abstract tagged null record;
   
   type Parameters_Kit_Record is new Abstract_Parameters_Type with
      record
	 Kit : Parameters_Kit_Array_Type;
      end record;
   
   Spec_Error : exception;
   Impl_Limit : exception;
           
end Gnos;