module FF.HTML.Spec.Safe.Selector.Examples where

open import Agda.Builtin.String using (String)
open import Cubical.Data.List.Base using (List; []; _∷_)

import FF.HTML.Selector.Core as Selector
import FF.HTML.Spec.Safe as Safe
import FF.HTML.Spec.Safe.Selector as Select

samplePage : Safe.HtmlT
samplePage =
  Safe.element Safe.sectionTag
    ( Safe.attribute Safe.idAttr "main"
    ∷ Safe.attribute Safe.classAttr (Safe.tokens "page")
    ∷ []
    )
    ( Safe.element Safe.h1Tag [] (Safe.text "Selectors" ∷ [])
    ∷ Safe.element Safe.navTag
        (Safe.attribute Safe.classAttr (Safe.tokens "primary-nav") ∷ [])
        ( Safe.element Safe.aTag
            ( Safe.attribute (Safe.hrefAttr Safe.hrefA) (Safe.url "/docs")
            ∷ Safe.attribute Safe.classAttr (Safe.tokens "nav-link")
            ∷ []
            )
            (Safe.text "Docs" ∷ [])
        ∷ Safe.element Safe.aTag
            ( Safe.attribute (Safe.hrefAttr Safe.hrefA) (Safe.url "/api")
            ∷ Safe.attribute Safe.classAttr (Safe.tokens "nav-link")
            ∷ []
            )
            (Safe.text "API" ∷ [])
        ∷ []
        )
    ∷ Safe.element Safe.pTag
        (Safe.attribute (Safe.dataAttr "state") "ready" ∷ [])
        (Safe.text "Static selector checks." ∷ [])
    ∷ Safe.element Safe.pTag [] []
    ∷ []
    )

sectionByTypedId : Select.SelectorT
sectionByTypedId =
  Select.single
    (Select.compound
      (Select.tagWith Safe.sectionTag
        (Select.typedId "main" ∷ [])))

linksUnderNav : Select.SelectorT
linksUnderNav =
  Select.single
    (Select.descendantOf
      (Select.compound (Select.tag Safe.navTag))
      (Select.tagWith Safe.aTag
        (Select.typedClass "nav-link" ∷ [])))

firstHeadingChild : Select.SelectorT
firstHeadingChild =
  Select.single
    (Select.childOf
      (Select.compound
        (Select.tagWith Safe.sectionTag
          (Select.typedId "main" ∷ [])))
      (Select.tagWith Safe.h1Tag
        (Select.typedPseudo "first-child" ∷ [])))

readyParagraph : Select.SelectorT
readyParagraph =
  Select.single
    (Select.compound
      (Select.tagWith Safe.pTag
        (Select.dataAttrEquals "state" "ready" ∷ [])))

emptyParagraph : Select.SelectorT
emptyParagraph =
  Select.single
    (Select.compound
      (Select.tagWith Safe.pTag
        (Select.typedPseudo "empty" ∷ [])))

rawHrefSelector : Select.SelectorT
rawHrefSelector =
  Selector.one
    (Selector.compound
      (Selector.universal
        (Select.rawAttrPresent "href" ∷ [])))

renderedLinksUnderNav : String
renderedLinksUnderNav = Select.render linksUnderNav

selectedLinksUnderNav : List Safe.HtmlT
selectedLinksUnderNav = Select.select linksUnderNav samplePage

selectedFirstHeadingChild : List Safe.HtmlT
selectedFirstHeadingChild = Select.select firstHeadingChild samplePage

selectedReadyParagraph : List Safe.HtmlT
selectedReadyParagraph = Select.select readyParagraph samplePage

selectedEmptyParagraph : List Safe.HtmlT
selectedEmptyParagraph = Select.select emptyParagraph samplePage

selectedRawHrefNodes : List Safe.HtmlT
selectedRawHrefNodes = Select.select rawHrefSelector samplePage