module FF.HTML.Spec.Loose.StyleSheet where

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

import FF.CSS.Spec.Loose as CSS
import FF.HTML.Spec.Loose as HTML
import FF.HTML.Spec.Loose.Selector as Selector
import FF.HTML.StyleSheet.Core as Sheet

RuleT : _
RuleT = Sheet.StyleRule HTML.spec CSS.spec

StyleSheetT : _
StyleSheetT = Sheet.StyleSheet HTML.spec CSS.spec

MatchedRuleT : _
MatchedRuleT = Sheet.MatchedRule HTML.spec CSS.spec

ElementStyleT : _
ElementStyleT = Sheet.ElementStyle HTML.spec CSS.spec

rule : Selector.SelectorT -> List CSS.DeclarationT -> RuleT
rule = Sheet.styleRule

sheet : List RuleT -> StyleSheetT
sheet = Sheet.fromRules

declaration : String -> String -> CSS.DeclarationT
declaration = CSS.declaration

render : StyleSheetT -> String
render = Sheet.renderStyleSheet HTML.renderer CSS.renderer

matchingRules : StyleSheetT -> HTML.HtmlT -> List MatchedRuleT
matchingRules = Sheet.matchingStyleSheet Selector.matcher

styledElements : StyleSheetT -> HTML.HtmlT -> List ElementStyleT
styledElements = Sheet.styledElements Selector.matcher

matchesRoot : StyleSheetT -> HTML.HtmlT -> Bool
matchesRoot stylesheet html with matchingRules stylesheet html
... | [] = false
... | _ ∷ _ = true