module FF.HTML.Spec.Common.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; []; _∷_)

open import FF.CSS.Core using (declare)
import FF.CSS.Spec.Common as CSS
import FF.CSS.Spec.Loose as LooseCSS
import FF.HTML.Spec.Common as HTML
import FF.HTML.Spec.Common.Selector as Selector
import FF.HTML.Spec.Loose as LooseHTML
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 : CSS.PropertyName -> String -> CSS.DeclarationT
declaration = declare

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

toLoose : StyleSheetT -> Sheet.StyleSheet LooseHTML.spec LooseCSS.spec
toLoose = Sheet.mapStyleSheet HTML.toLoose CSS.toLoose

renderedByLooseRenderer : StyleSheetT -> String
renderedByLooseRenderer stylesheet =
  Sheet.renderStyleSheet LooseHTML.renderer LooseCSS.renderer (toLoose stylesheet)

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

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

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