module DPRLR.Gluing.GluingModel where

open import Cubical.Foundations.Prelude using (Level ; ℓ-suc)

open import DPRLR.Object.Simple.Model public
  using (SimpleCwF ; SimpleDirectedStructure ; SimpleDirectedCwF ; tm-∙)

open import DPRLR.Gluing.Simple.Judgment public
  using
    ( GluCtx ; Γ° ; Γ∙
    ; GluSub ; σ° ; σ∙
    ; GluTy ;  ; A∙ ; cA
    ; GluTm ;  ; M∙
    )

open import DPRLR.Gluing.Simple.Substitution public
  using
    ( εᵍ
    ; ε-subᵍ ; εηᵍ
    ; idᵍ ; _∘ᵍ_ ; id-leftᵍ ; id-rightᵍ ; ∘-assocᵍ
    ; _[_]Tmᵍ ; Tm-idᵍ ; Tm-∘ᵍ
    ; _▷ᵍ_ ; pᵍ ; qᵍ ; ⟨_,_⟩ᵍ ; liftᵍ ; p-⟨⟩ᵍ ; q-⟨⟩ᵍ
    ; ▷ηᵍ ; ⟨⟩-∘ᵍ
    )

open import DPRLR.Gluing.Simple.Product public
  using
    ( PROD ; PAIR ; FST ; SND
    ; PAIR[] ; FST[] ; SND[]
    ; PROD-preserves-β₁ ; PROD-preserves-β₂ ; PROD-preserves-η
    )

open import DPRLR.Gluing.Simple.Function public
  using
    ( FUN ; APP ; LAM
    ; APP[] ; LAM[]
    ; FUN-preserves-β ; FUN-preserves-η
    )

open import DPRLR.Gluing.Simple.Bool public
  using
    ( BOOL ; TRUE ; FALSE ; TRUE[] ; FALSE[]
    ; IF ; IF[] ; IF-preserves-β-true ; IF-preserves-β-false
    )

module _ {ℓM : Level} (𝓜 : SimpleDirectedCwF ℓM) where

  GluingCwF : SimpleCwF (ℓ-suc ℓM)
  SimpleCwF.Ctx GluingCwF = GluCtx 𝓜
  SimpleCwF.Ty GluingCwF = GluTy 𝓜
  SimpleCwF.Sub GluingCwF = GluSub 𝓜
  SimpleCwF.Tm GluingCwF = GluTm 𝓜
  SimpleCwF.id GluingCwF {Γ = Γ} = idᵍ 𝓜 Γ
  SimpleCwF._∘_ GluingCwF = _∘ᵍ_ 𝓜
  SimpleCwF.id-left GluingCwF = id-leftᵍ 𝓜
  SimpleCwF.id-right GluingCwF = id-rightᵍ 𝓜
  SimpleCwF.∘-assoc GluingCwF = ∘-assocᵍ 𝓜
  SimpleCwF._[_]Tm GluingCwF = _[_]Tmᵍ 𝓜
  SimpleCwF.Tm-id GluingCwF = Tm-idᵍ 𝓜
  SimpleCwF.Tm-∘ GluingCwF = Tm-∘ᵍ 𝓜
  SimpleCwF.ε GluingCwF = εᵍ 𝓜
  SimpleCwF.ε-sub GluingCwF = ε-subᵍ 𝓜
  SimpleCwF.εη GluingCwF = εηᵍ 𝓜
  SimpleCwF._▷_ GluingCwF = _▷ᵍ_ 𝓜
  SimpleCwF.p GluingCwF {Γ = Γ} {A = A} =
    pᵍ 𝓜 {Γ = Γ} {A = A}
  SimpleCwF.q GluingCwF {Γ = Γ} {A = A} =
    qᵍ 𝓜 {Γ = Γ} {A = A}
  SimpleCwF.⟨_,_⟩ GluingCwF = ⟨_,_⟩ᵍ 𝓜
  SimpleCwF.p-⟨⟩ GluingCwF {Γ = Γ} {Δ = Δ} {A = A} σ M =
    p-⟨⟩ᵍ 𝓜 {Γ = Γ} {Δ = Δ} {A = A} σ M
  SimpleCwF.q-⟨⟩ GluingCwF {Γ = Γ} {Δ = Δ} {A = A} σ M =
    q-⟨⟩ᵍ 𝓜 {Γ = Γ} {Δ = Δ} {A = A} σ M
  SimpleCwF.▷η GluingCwF {Γ = Γ} {A = A} =
    ▷ηᵍ 𝓜 {Γ = Γ} {A = A}
  SimpleCwF.⟨⟩-∘ GluingCwF = ⟨⟩-∘ᵍ 𝓜
  SimpleCwF.Bool GluingCwF = BOOL 𝓜
  SimpleCwF.true GluingCwF = TRUE 𝓜
  SimpleCwF.false GluingCwF = FALSE 𝓜
  SimpleCwF.if_then_else_ GluingCwF = IF 𝓜
  SimpleCwF.true[] GluingCwF = TRUE[] 𝓜
  SimpleCwF.false[] GluingCwF = FALSE[] 𝓜
  SimpleCwF.if[] GluingCwF = IF[] 𝓜
  SimpleCwF.βif-true GluingCwF = IF-preserves-β-true 𝓜
  SimpleCwF.βif-false GluingCwF = IF-preserves-β-false 𝓜
  SimpleCwF._×ᵗʸ_ GluingCwF = PROD 𝓜
  SimpleCwF.pair GluingCwF = PAIR 𝓜
  SimpleCwF.fst GluingCwF {Γ = Γ} {A = A} {B = B} P =
    FST 𝓜 {Γ = Γ} {A = A} {B = B} P
  SimpleCwF.snd GluingCwF {Γ = Γ} {A = A} {B = B} P =
    SND 𝓜 {Γ = Γ} {A = A} {B = B} P
  SimpleCwF.pair[] GluingCwF = PAIR[] 𝓜
  SimpleCwF.fst[] GluingCwF {Γ = Γ} {Δ = Δ} {A = A} {B = B} P σ =
    FST[] 𝓜 {Γ = Γ} {Δ = Δ} {A = A} {B = B} P σ
  SimpleCwF.snd[] GluingCwF {Γ = Γ} {Δ = Δ} {A = A} {B = B} P σ =
    SND[] 𝓜 {Γ = Γ} {Δ = Δ} {A = A} {B = B} P σ
  SimpleCwF._⇒ᵗʸ_ GluingCwF = FUN 𝓜
  SimpleCwF.lam GluingCwF {Γ = Γ} {A = A} {B = B} N =
    LAM 𝓜 {Γ = Γ} {A = A} {B = B} N
  SimpleCwF.app GluingCwF = APP 𝓜
  SimpleCwF.lam[] GluingCwF {Γ = Γ} {Δ = Δ} {A = A} {B = B} N σ =
    LAM[] 𝓜 {Γ = Γ} {Δ = Δ} {A = A} {B = B} N σ
  SimpleCwF.app[] GluingCwF = APP[] 𝓜
  SimpleCwF.β⇒ GluingCwF = FUN-preserves-β 𝓜
  SimpleCwF.η⇒ GluingCwF {Γ = Γ} {A = A} {B = B} F =
    FUN-preserves-η 𝓜 {Γ = Γ} {A = A} {B = B} F
  SimpleCwF.β×₁ GluingCwF {Γ = Γ} {A = A} {B = B} M N =
    PROD-preserves-β₁ 𝓜 {Γ = Γ} {A = A} {B = B} M N
  SimpleCwF.β×₂ GluingCwF {Γ = Γ} {A = A} {B = B} M N =
    PROD-preserves-β₂ 𝓜 {Γ = Γ} {A = A} {B = B} M N
  SimpleCwF.η× GluingCwF {Γ = Γ} {A = A} {B = B} P =
    PROD-preserves-η 𝓜 {Γ = Γ} {A = A} {B = B} P