-- elhoim is full object organizer with editor and command interpreter.
-- Elhoim is Copyright (C) 2023 Manuel De Girardi ; 
--
--   This program is free software; you can redistribute it and/or modify
--   it under the terms of the GNU General Public License as published by
--   the Free Software Foundation; either version 2 of the License, or
--   (at your option) any later version.
--
--   This program is distributed in the hope that it will be useful,
--   but WITHOUT ANY WARRANTY; without even the implied warranty of
--   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--   GNU General Public License for more details.
--
--   You should have received a copy of the GNU General Public License
--   along with this program; if not, write to the Free Software
--   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
--
-- Date := "2023-05-26 17:40:38"
-- Version := "0.6.6b"
with Ada.Wide_Text_Io;
with Ada.Text_Io;
use Ada;

package body El.Projec 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;
   
   
   procedure initialize(Objects_Context : in out Objects_Context_Record;
			Objects_Params  : in Objects_Parameters_Type) is
   begin     
      
      Objects_Context.Objects_Params := Parameters.Objects_Parameters_Type(Objects_Params);
      
      Language.Initialize(Language_Context_Record(Objects_Context), Language_Parameters_Type(Objects_Params));
   end Initialize;
   procedure Load_project(Objects_Context : in out Objects_Context_Record;			
			Ada_Path : in String;
			Gtk_Path : in String;
			Aws_Path : in String;
			Project_Path : in String) is
   begin     
      
      
      
      Language.Load_Project(Language_Context_Record(Objects_Context), Ada_Path, Gtk_Path, Aws_Path, Project_Path);
   end Load_project;
   
   
   procedure Initialize
     
     (
      Data : in out Data_Class;
      Project : in Gnose_Project_Type
     ) is
   begin
      Data.Project :=
	new Gnose_Project_Type '
	
	(Project);
   end Initialize;


end El.Projec ;