--------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Gnostic is Ada Generic Neural Object System Engineering.                                                                                                --
-- Gnostic (C) Copyright 2016 Manuel De Girardi.                                                                                                           --
--------------------------------------------------------------------------------------------------------------------------------------------------------------
  
--------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Date        := 2016-11-27 19:33:08 ; 
-- Description : Ada Generic Neural Object System Engineering.                                                                                              --
-- Version     := 2016.12.1a ; 
-- Authors     : Manuel De Girardi.                                                                                                                         --
--------------------------------------------------------------------------------------------------------------------------------------------------------------
with Ada.Wide_Text_Io;
with Ada.Text_Io;
use Ada;

package body Gnos.Machines is
   
   procedure initialize(Language_Context : in out Language_Context_Record;
			Language_Params  : in Language_Parameters_Type) is
   begin
      Language_Context.Language_params := Language_Params;      
      Agnose_Projects.Initialize(Projects_Context_Record(Language_Context), Projects_Parameters_Type(Language_Params));
   end Initialize;
   
   procedure Load_project(Language_Context : in out Language_Context_Record;			
			  Ada_Path : in String;
			  Gtk_Path : in String;
			  Aws_Path : in String;
			  Project_Path : in String) is
      
      Ada_Type : constant Ada_With_Type := Ada_With_Type'Val(Boolean'Pos(Language_Context.Language_Params.With_Ada));
      Gtk_Type : constant Gtk_With_Type := Gtk_With_Type'Val(Boolean'Pos(Language_Context.Language_Params.With_Gtk));
      Aws_Type : constant Aws_With_Type := Aws_With_Type'Val(Boolean'Pos(Language_Context.Language_Params.With_Aws));
      
   begin
            

      case Gtk_Type is
	 when Without_Gtk =>
	    case Ada_Type is
	       when without_Ada =>
		  		  
		  Language_Context.Project := new Project_Without_Ada_Record_Type(Without_Gtk);
	       when others =>
		  
		  Language_Context.Project := new Project_With_Ada_Record_Type(Without_Gtk);
		  Language_Context.Project.Load_Ada(Path_Name => Ada_Path);
	    end case;      
	 when others =>
	    case Ada_Type is
	       
	       when without_Ada =>
		  
		  Language_Context.Project := new Project_Without_Ada_Record_Type(With_Gtk);
	       when others =>
		  
		  Language_Context.Project := new Project_With_Ada_Record_Type(With_Gtk);
		  Language_Context.Project.Load_Ada(Path_Name => Ada_Path);
	    end case;
	    
	    Language_Context.Project.Load_GtkAda(Path_Name => Gtk_Path);
      end case;

      case Aws_Type is
	 when Without_Aws =>
	    null;
	 when others =>	    
	    
	    Language_Context.Project.Load_Aws(Path_Name => Aws_Path);
      end case;
      
      Language_Context.Project.Load_Project(Project_Path);
      
   end Load_Project;	 
   
   

   function Check_Parameters(Language_Context : in Language_Context_Record'Class;
			     Params : in Parameters.Language_Parameters_Type'class) return Boolean is
      
      Checked : Boolean := False;
      
   begin
      Wide_Text_Io.Put("Language Context :");
      Checked := Language_Context.Language_Params = Language_Parameters_Type(Params);
      
      if not Checked then	 
	 if Language_Context.Language_Params.Char_Max /= Language_Parameters_Type(Params).Char_Max then
	    Text_Io.New_Line;
	    Text_Io.Put_Line("Char_Max : " & 
		       Integer'Image(Language_Context.Language_Params.Char_Max) & " /= " &
		       Integer'Image(Language_Parameters_Type(Params).Char_Max));
	 end if;
	 if Language_Context.Language_Params.Version /= Language_Parameters_Type(Params).Version then
	    Text_Io.Put_Line("Version : " & 
		       Integer'Image(Language_Context.Language_Params.Version) & " /= " &
		       Integer'Image(Language_Parameters_Type(Params).Version));	    
	 end if;
	 raise Program_Error;
      end if;
      Wide_Text_Io.Put("Ok, ");
      Checked := Checked and Agnose_Projects.Check_Parameters(Projects_Context_Record(Language_Context), params);
      return Checked;
   end Check_Parameters;
   
   
   procedure Load_Language(Language_Set : in out Language_Set_Array_Type; Machine_Lang : in Machine_Lang_Enum) is
      
   begin
      Text_Io.Put_Line("Creating Machine Language for : " & Machine_Lang_Enum'Image(Machine_Lang));
      Language_Set(Machine_Lang) := new Language_Unit_Record ' (Machine_Lang => Machine_Lang);
   end Load_Language;
   
end Gnos.Machines;