--
--  Copyright (C) 2021-2026, AdaCore
--
--  SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
--

with VSS.Characters;

with Markdown.Implementation.List_Items;

package body Markdown.Implementation.Lists is

   --------------
   -- Is_Loose --
   --------------

   function Is_Loose (Self : List'Class) return Boolean is
      Ends_Blank : Boolean := False;
      Result     : Boolean := False;
   begin
      for Child of Self.Children loop
         declare
            Item : Markdown.Implementation.List_Items.List_Item renames
              Markdown.Implementation.List_Items.List_Item (Child.all);
         begin
            Result := Item.Has_Blank_Line or Ends_Blank;
            Ends_Blank := Item.Ends_With_Blank_Line;

            exit when Result;
         end;
      end loop;

      return Result;
   end Is_Loose;

   ----------------
   -- Is_Ordered --
   ----------------

   function Is_Ordered (Self : List'Class) return Boolean is
      First : Markdown.Implementation.List_Items.List_Item renames
        Markdown.Implementation.List_Items.List_Item
          (Self.Children.First_Element.all);

   begin
      return First.Is_Ordered;
   end Is_Ordered;

   -----------
   -- Match --
   -----------

   function Match
     (Self : List'Class; Item : Abstract_Block_Access) return Boolean
   is
      use type VSS.Characters.Virtual_Character;

      First : Markdown.Implementation.List_Items.List_Item renames
        Markdown.Implementation.List_Items.List_Item
          (Self.Children.First_Element.all);

      Next : Markdown.Implementation.List_Items.List_Item renames
        Markdown.Implementation.List_Items.List_Item (Item.all);

      First_Marker : constant VSS.Strings.Virtual_String := First.Marker;
      Next_Marker  : constant VSS.Strings.Virtual_String := Next.Marker;
   begin
      return
        First_Marker.At_Last_Character.Element
        = Next_Marker.At_Last_Character.Element;
   end Match;

   -----------
   -- Start --
   -----------

   function Start (Self : List'Class) return Natural is
      First : Markdown.Implementation.List_Items.List_Item renames
        Markdown.Implementation.List_Items.List_Item
          (Self.Children.First_Element.all);

   begin
      return First.Marker;
   end Start;

   ------------
   -- Create --
   ------------

   overriding
   function Create (Input : not null access Input_Position) return List is
   begin
      raise Program_Error with "Unexpected Create";
      --  This return statement is not executed, but required for the gnatcov
      --  instrumentation to compile.
      return (others => <>);
   end Create;

end Markdown.Implementation.Lists;
