module DPRLR.Object.Simple.Syntax.Displayed where

open import Cubical.Foundations.Prelude hiding (Sub ; _▷_ ; fst ; snd)
open import Cubical.Data.Sigma using () renaming (fst to proj₁ ; snd to proj₂)

open import DPRLR.Simplicial.Hom
open import DPRLR.Object.Simple.Displayed
open import DPRLR.Object.Simple.Syntax.RawModel
open import DPRLR.Object.Simple.Syntax.Base

module _ {ℓD₀ ℓD₁ : Level}
  (𝓓 : DisplayedSimpleCwF ℓD₀ ℓD₁ RawSyntaxCwF) where

  open DisplayedSimpleCwF 𝓓

  mutual
    Ctxˢ : (Γ : Ctx)  Ctx∙ Γ
    Ctxˢ ε = ε∙
    Ctxˢ (Γ  A) = Ctxˢ Γ ▷∙ Tyˢ A

    Tyˢ : (A : Ty)  Ty∙ A
    Tyˢ Bool = Bool∙
    Tyˢ (A ×ᵗʸ B) = Tyˢ A ×ᵗʸ∙ Tyˢ B
    Tyˢ (A ⇒ᵗʸ B) = Tyˢ A ⇒ᵗʸ∙ Tyˢ B

    Subˢ :
      {Γ Δ : Ctx}
      (σ : Sub Γ Δ)
       Sub∙ (Ctxˢ Γ) (Ctxˢ Δ) σ
    Subˢ id = id∙
    Subˢ (τ  σ) = Subˢ τ ∘∙ Subˢ σ
    Subˢ ε-sub = ε-sub∙
    Subˢ (εη σ i) = εη∙ (Subˢ σ) i
    Subˢ p = p∙
    Subˢ  σ , M  =  Subˢ σ , Tmˢ M ⟩∙
    Subˢ (id-left σ i) = id-left∙ (Subˢ σ) i
    Subˢ (id-right σ i) = id-right∙ (Subˢ σ) i
    Subˢ (∘-assoc ρ τ σ i) = ∘-assoc∙ (Subˢ ρ) (Subˢ τ) (Subˢ σ) i
    Subˢ (p-⟨⟩ σ M i) = p-⟨⟩∙ (Subˢ σ) (Tmˢ M) i
    Subˢ (▷η i) = ▷η∙ i
    Subˢ (⟨⟩-∘ σ M ρ i) = ⟨⟩-∘∙ (Subˢ σ) (Tmˢ M) (Subˢ ρ) i

    Tmˢ :
      {Γ : Ctx} {A : Ty}
      (M : Tm Γ A)
       Tm∙ (Ctxˢ Γ) (Tyˢ A) M
    Tmˢ qᶜ = q∙
    Tmˢ (substTmᶜ M σ) = Tmˢ M [ Subˢ σ ]Tm∙
    Tmˢ (Tm-id M i) = Tm-id∙ (Tmˢ M) i
    Tmˢ (Tm-∘ M τ σ i) = Tm-∘∙ (Tmˢ M) (Subˢ τ) (Subˢ σ) i
    Tmˢ (q-⟨⟩ σ M i) = q-⟨⟩∙ (Subˢ σ) (Tmˢ M) i
    Tmˢ true = true∙
    Tmˢ false = false∙
    Tmˢ (if B then T else F) = if∙ (Tmˢ B) (Tmˢ T) (Tmˢ F)
    Tmˢ (true[] σ i) = true[]∙ (Subˢ σ) i
    Tmˢ (false[] σ i) = false[]∙ (Subˢ σ) i
    Tmˢ (if[] B T F σ i) =
      if[]∙ (Tmˢ B) (Tmˢ T) (Tmˢ F) (Subˢ σ) i
    Tmˢ (pair M N) = pair∙ (Tmˢ M) (Tmˢ N)
    Tmˢ (fst P) = fst∙ (Tmˢ P)
    Tmˢ (snd P) = snd∙ (Tmˢ P)
    Tmˢ (pair[] M N σ i) = pair[]∙ (Tmˢ M) (Tmˢ N) (Subˢ σ) i
    Tmˢ (fst[] P σ i) = fst[]∙ (Tmˢ P) (Subˢ σ) i
    Tmˢ (snd[] P σ i) = snd[]∙ (Tmˢ P) (Subˢ σ) i
    Tmˢ (lam N) = lam∙ (Tmˢ N)
    Tmˢ (app F M) = app∙ (Tmˢ F) (Tmˢ M)
    Tmˢ (lam[] N σ i) = lam[]∙ (Tmˢ N) (Subˢ σ) i
    Tmˢ (app[] F M σ i) = app[]∙ (Tmˢ F) (Tmˢ M) (Subˢ σ) i
    Tmˢ (βif-true-rel T F i) = proj₁ (βif-true∙ (Tmˢ T) (Tmˢ F)) i
    Tmˢ (βif-true-left T F i) = proj₁ (proj₂ (βif-true∙ (Tmˢ T) (Tmˢ F))) i
    Tmˢ (βif-true-right T F i) = proj₂ (proj₂ (βif-true∙ (Tmˢ T) (Tmˢ F))) i
    Tmˢ (βif-false-rel T F i) = proj₁ (βif-false∙ (Tmˢ T) (Tmˢ F)) i
    Tmˢ (βif-false-left T F i) = proj₁ (proj₂ (βif-false∙ (Tmˢ T) (Tmˢ F))) i
    Tmˢ (βif-false-right T F i) = proj₂ (proj₂ (βif-false∙ (Tmˢ T) (Tmˢ F))) i
    Tmˢ (β×₁-rel M N i) = proj₁ (β×₁∙ (Tmˢ M) (Tmˢ N)) i
    Tmˢ (β×₁-left M N i) = proj₁ (proj₂ (β×₁∙ (Tmˢ M) (Tmˢ N))) i
    Tmˢ (β×₁-right M N i) = proj₂ (proj₂ (β×₁∙ (Tmˢ M) (Tmˢ N))) i
    Tmˢ (β×₂-rel M N i) = proj₁ (β×₂∙ (Tmˢ M) (Tmˢ N)) i
    Tmˢ (β×₂-left M N i) = proj₁ (proj₂ (β×₂∙ (Tmˢ M) (Tmˢ N))) i
    Tmˢ (β×₂-right M N i) = proj₂ (proj₂ (β×₂∙ (Tmˢ M) (Tmˢ N))) i
    Tmˢ (η×-rel P i) = proj₁ (η×∙ (Tmˢ P)) i
    Tmˢ (η×-left P i) = proj₁ (proj₂ (η×∙ (Tmˢ P))) i
    Tmˢ (η×-right P i) = proj₂ (proj₂ (η×∙ (Tmˢ P))) i
    Tmˢ (β⇒-rel N M i) = proj₁ (β⇒∙ (Tmˢ N) (Tmˢ M)) i
    Tmˢ (β⇒-left N M i) = proj₁ (proj₂ (β⇒∙ (Tmˢ N) (Tmˢ M))) i
    Tmˢ (β⇒-right N M i) = proj₂ (proj₂ (β⇒∙ (Tmˢ N) (Tmˢ M))) i
    Tmˢ (η⇒-rel F i) = proj₁ (η⇒∙ (Tmˢ F)) i
    Tmˢ (η⇒-left F i) = proj₁ (proj₂ (η⇒∙ (Tmˢ F))) i
    Tmˢ (η⇒-right F i) = proj₂ (proj₂ (η⇒∙ (Tmˢ F))) i

  syntax-elim-displayed : DisplayedSection 𝓓
  DisplayedSection.Ctxˢ syntax-elim-displayed = Ctxˢ
  DisplayedSection.Tyˢ syntax-elim-displayed = Tyˢ
  DisplayedSection.Subˢ syntax-elim-displayed = Subˢ
  DisplayedSection.Tmˢ syntax-elim-displayed = Tmˢ