{-# OPTIONS --safe --cubical #-}

module OWL2.Portable.ProfileRestrictions where

open import Cubical.Data.Nat.Base using (suc)
open import OWL2.Prelude
import OWL2.Portable.Syntax as P
import OWL2.Profiles.EL as EL
import OWL2.Profiles.QL as QL
import OWL2.Profiles.RL as RL

private
  listCount : ∀ {ℓ} {A : Type ℓ} → List A → ℕ
  listCount [] =
    0
  listCount (x ∷ xs) =
    suc (listCount xs)

record ProfileRestrictionsReport : Type₀ where
  constructor profileRestrictionsReport
  field
    profileRestrictionsReportDocument :
      P.OntologyDocument
    profileRestrictionsELReport :
      EL.ELReport
    profileRestrictionsQLReport :
      QL.QLReport
    profileRestrictionsRLReport :
      RL.RLReport
    profileRestrictionsNonELFeatures :
      List EL.NonELFeature
    profileRestrictionsNonQLFeatures :
      List QL.NonQLFeature
    profileRestrictionsNonRLFeatures :
      List RL.NonRLFeature
    profileRestrictionsNonELFeatureCount :
      ℕ
    profileRestrictionsNonQLFeatureCount :
      ℕ
    profileRestrictionsNonRLFeatureCount :
      ℕ

open ProfileRestrictionsReport public

reportProfileRestrictions :
  P.OntologyDocument → ProfileRestrictionsReport
reportProfileRestrictions document =
  profileRestrictionsReport
    document
    elReport
    qlReport
    rlReport
    (EL.nonELFeatures elReport)
    (QL.nonQLFeatures qlReport)
    (RL.nonRLFeatures rlReport)
    (listCount (EL.nonELFeatures elReport))
    (listCount (QL.nonQLFeatures qlReport))
    (listCount (RL.nonRLFeatures rlReport))
  where
  elReport : EL.ELReport
  elReport =
    EL.ontologyDocumentReport document

  qlReport : QL.QLReport
  qlReport =
    QL.ontologyDocumentReport document

  rlReport : RL.RLReport
  rlReport =
    RL.ontologyDocumentReport document

ELReportEmpty : EL.ELReport → Type₀
ELReportEmpty report =
  EL.NoNonELFeatures (EL.nonELFeatures report)

QLReportEmpty : QL.QLReport → Type₀
QLReportEmpty report =
  QL.NoNonQLFeatures (QL.nonQLFeatures report)

RLReportEmpty : RL.RLReport → Type₀
RLReportEmpty report =
  RL.NoNonRLFeatures (RL.nonRLFeatures report)

NoReportNonELFeatures :
  ProfileRestrictionsReport → Type₀
NoReportNonELFeatures report =
  EL.NoNonELFeatures (profileRestrictionsNonELFeatures report)

NoReportNonQLFeatures :
  ProfileRestrictionsReport → Type₀
NoReportNonQLFeatures report =
  QL.NoNonQLFeatures (profileRestrictionsNonQLFeatures report)

NoReportNonRLFeatures :
  ProfileRestrictionsReport → Type₀
NoReportNonRLFeatures report =
  RL.NoNonRLFeatures (profileRestrictionsNonRLFeatures report)

NoNonELProfileFeatures :
  P.OntologyDocument → Type₀
NoNonELProfileFeatures document =
  NoReportNonELFeatures (reportProfileRestrictions document)

NoNonQLProfileFeatures :
  P.OntologyDocument → Type₀
NoNonQLProfileFeatures document =
  NoReportNonQLFeatures (reportProfileRestrictions document)

NoNonRLProfileFeatures :
  P.OntologyDocument → Type₀
NoNonRLProfileFeatures document =
  NoReportNonRLFeatures (reportProfileRestrictions document)

record AllProfileRestrictions
  (report : ProfileRestrictionsReport) : Type₀ where
  constructor allProfileRestrictions
  field
    allProfileRestrictionsEL :
      NoReportNonELFeatures report
    allProfileRestrictionsQL :
      NoReportNonQLFeatures report
    allProfileRestrictionsRL :
      NoReportNonRLFeatures report

open AllProfileRestrictions public

AllProfileDocument : P.OntologyDocument → Type₀
AllProfileDocument document =
  AllProfileRestrictions (reportProfileRestrictions document)