module DPRLR.Object.Simple.Syntax.LocalizedCoherence where

open import Cubical.Foundations.Prelude hiding (Sub ; _▷_ ; fst ; snd)

open import DPRLR.Simplicial.Hom
open import DPRLR.Object.Simple.Syntax.LocalizedSyntax
import DPRLR.Object.Simple.Syntax.Base as Raw

private
  variable
    Γ Δ Θ Ξ : Raw.Ctx
    A B : Raw.Ty

id-leftᴾ-η :
  (σ : Raw.Sub Γ Δ)
   id-leftᴾ (ηSubᴾ σ)  cong ηSubᴾ (Raw.id-left σ)
id-leftᴾ-η σ =
  Subᴾ-isSet _ _ (id-leftᴾ (ηSubᴾ σ)) (cong ηSubᴾ (Raw.id-left σ))

id-rightᴾ-η :
  (σ : Raw.Sub Γ Δ)
   id-rightᴾ (ηSubᴾ σ)  cong ηSubᴾ (Raw.id-right σ)
id-rightᴾ-η σ =
  Subᴾ-isSet _ _ (id-rightᴾ (ηSubᴾ σ)) (cong ηSubᴾ (Raw.id-right σ))

∘-assocᴾ-η :
  (ρ : Raw.Sub Θ Ξ) (τ : Raw.Sub Δ Θ) (σ : Raw.Sub Γ Δ)
   ∘-assocᴾ (ηSubᴾ ρ) (ηSubᴾ τ) (ηSubᴾ σ)
     cong ηSubᴾ (Raw.∘-assoc ρ τ σ)
∘-assocᴾ-η ρ τ σ =
  Subᴾ-isSet
    _
    _
    (∘-assocᴾ (ηSubᴾ ρ) (ηSubᴾ τ) (ηSubᴾ σ))
    (cong ηSubᴾ (Raw.∘-assoc ρ τ σ))

εηᴾ-η :
  (σ : Raw.Sub Γ Raw.ε)
   εηᴾ (ηSubᴾ σ)  cong ηSubᴾ (Raw.εη σ)
εηᴾ-η σ =
  Subᴾ-isSet _ _ (εηᴾ (ηSubᴾ σ)) (cong ηSubᴾ (Raw.εη σ))

p-⟨⟩ᴾ-η :
  (σ : Raw.Sub Γ Δ) (M : Raw.Tm Γ A)
   p-⟨⟩ᴾ (ηSubᴾ σ) (ηTmᴾ M)
     cong ηSubᴾ (Raw.p-⟨⟩ σ M)
p-⟨⟩ᴾ-η σ M =
  Subᴾ-isSet
    _
    _
    (p-⟨⟩ᴾ (ηSubᴾ σ) (ηTmᴾ M))
    (cong ηSubᴾ (Raw.p-⟨⟩ σ M))

q-⟨⟩ᴾ-η :
  (σ : Raw.Sub Γ Δ) (M : Raw.Tm Γ A)
   q-⟨⟩ᴾ (ηSubᴾ σ) (ηTmᴾ M)
     cong ηTmᴾ (Raw.q-⟨⟩ σ M)
q-⟨⟩ᴾ-η σ M =
  Tmᴾ-isSet
    _
    _
    (q-⟨⟩ᴾ (ηSubᴾ σ) (ηTmᴾ M))
    (cong ηTmᴾ (Raw.q-⟨⟩ σ M))

▷ηᴾ-η :
  {Γ : Raw.Ctx} {A : Raw.Ty}
   ▷ηᴾ {Γ = Γ} {A = A}  cong ηSubᴾ (Raw.▷η {Γ = Γ} {A = A})
▷ηᴾ-η =
  Subᴾ-isSet _ _ ▷ηᴾ (cong ηSubᴾ Raw.▷η)

Tmᴾ-id-η :
  (M : Raw.Tm Γ A)
   Tmᴾ-id (ηTmᴾ M)  cong ηTmᴾ (Raw.Tm-id M)
Tmᴾ-id-η M =
  Tmᴾ-isSet _ _ (Tmᴾ-id (ηTmᴾ M)) (cong ηTmᴾ (Raw.Tm-id M))

Tmᴾ-∘-η :
  (M : Raw.Tm Ξ A)
  (τ : Raw.Sub Δ Ξ)
  (σ : Raw.Sub Γ Δ)
   Tmᴾ-∘ (ηTmᴾ M) (ηSubᴾ τ) (ηSubᴾ σ)
     cong ηTmᴾ (Raw.Tm-∘ M τ σ)
Tmᴾ-∘-η M τ σ =
  Tmᴾ-isSet
    _
    _
    (Tmᴾ-∘ (ηTmᴾ M) (ηSubᴾ τ) (ηSubᴾ σ))
    (cong ηTmᴾ (Raw.Tm-∘ M τ σ))

⟨⟩-∘ᴾ-η :
  (σ : Raw.Sub Γ Δ) (M : Raw.Tm Γ A) (ρ : Raw.Sub Θ Γ)
   ⟨⟩-∘ᴾ (ηSubᴾ σ) (ηTmᴾ M) (ηSubᴾ ρ)
     cong ηSubᴾ (Raw.⟨⟩-∘ σ M ρ)
⟨⟩-∘ᴾ-η σ M ρ =
  Subᴾ-isSet
    _
    _
    (⟨⟩-∘ᴾ (ηSubᴾ σ) (ηTmᴾ M) (ηSubᴾ ρ))
    (cong ηSubᴾ (Raw.⟨⟩-∘ σ M ρ))

true[]ᴾ-η :
  (σ : Raw.Sub Γ Δ)
   true[]ᴾ (ηSubᴾ σ)  cong ηTmᴾ (Raw.true[] σ)
true[]ᴾ-η σ =
  Tmᴾ-isSet _ _ (true[]ᴾ (ηSubᴾ σ)) (cong ηTmᴾ (Raw.true[] σ))

false[]ᴾ-η :
  (σ : Raw.Sub Γ Δ)
   false[]ᴾ (ηSubᴾ σ)  cong ηTmᴾ (Raw.false[] σ)
false[]ᴾ-η σ =
  Tmᴾ-isSet _ _ (false[]ᴾ (ηSubᴾ σ)) (cong ηTmᴾ (Raw.false[] σ))

if[]ᴾ-η :
  (M : Raw.Tm Δ Raw.Bool) (N O : Raw.Tm Δ A) (σ : Raw.Sub Γ Δ)
   if[]ᴾ (ηTmᴾ M) (ηTmᴾ N) (ηTmᴾ O) (ηSubᴾ σ)
     cong ηTmᴾ (Raw.if[] M N O σ)
if[]ᴾ-η M N O σ =
  Tmᴾ-isSet
    _
    _
    (if[]ᴾ (ηTmᴾ M) (ηTmᴾ N) (ηTmᴾ O) (ηSubᴾ σ))
    (cong ηTmᴾ (Raw.if[] M N O σ))

pair[]ᴾ-η :
  (M : Raw.Tm Δ A) (N : Raw.Tm Δ B) (σ : Raw.Sub Γ Δ)
   pair[]ᴾ (ηTmᴾ M) (ηTmᴾ N) (ηSubᴾ σ)
     cong ηTmᴾ (Raw.pair[] M N σ)
pair[]ᴾ-η M N σ =
  Tmᴾ-isSet
    _
    _
    (pair[]ᴾ (ηTmᴾ M) (ηTmᴾ N) (ηSubᴾ σ))
    (cong ηTmᴾ (Raw.pair[] M N σ))

fst[]ᴾ-η :
  (P : Raw.Tm Δ (A Raw.×ᵗʸ B)) (σ : Raw.Sub Γ Δ)
   fst[]ᴾ (ηTmᴾ P) (ηSubᴾ σ)
     cong ηTmᴾ (Raw.fst[] P σ)
fst[]ᴾ-η P σ =
  Tmᴾ-isSet _ _ (fst[]ᴾ (ηTmᴾ P) (ηSubᴾ σ)) (cong ηTmᴾ (Raw.fst[] P σ))

snd[]ᴾ-η :
  (P : Raw.Tm Δ (A Raw.×ᵗʸ B)) (σ : Raw.Sub Γ Δ)
   snd[]ᴾ (ηTmᴾ P) (ηSubᴾ σ)
     cong ηTmᴾ (Raw.snd[] P σ)
snd[]ᴾ-η P σ =
  Tmᴾ-isSet _ _ (snd[]ᴾ (ηTmᴾ P) (ηSubᴾ σ)) (cong ηTmᴾ (Raw.snd[] P σ))

lam[]ᴾ-η :
  (N : Raw.Tm (Δ Raw.▷ A) B) (σ : Raw.Sub Γ Δ)
   lam[]ᴾ (ηTmᴾ N) (ηSubᴾ σ)
     cong ηTmᴾ (Raw.lam[] N σ)
lam[]ᴾ-η N σ =
  Tmᴾ-isSet
    _
    _
    (lam[]ᴾ (ηTmᴾ N) (ηSubᴾ σ))
    (cong ηTmᴾ (Raw.lam[] N σ))

app[]ᴾ-η :
  (F : Raw.Tm Δ (A Raw.⇒ᵗʸ B)) (M : Raw.Tm Δ A) (σ : Raw.Sub Γ Δ)
   app[]ᴾ (ηTmᴾ F) (ηTmᴾ M) (ηSubᴾ σ)
     cong ηTmᴾ (Raw.app[] F M σ)
app[]ᴾ-η F M σ =
  Tmᴾ-isSet
    _
    _
    (app[]ᴾ (ηTmᴾ F) (ηTmᴾ M) (ηSubᴾ σ))
    (cong ηTmᴾ (Raw.app[] F M σ))

βif-trueᴾ-η :
  (T F : Raw.Tm Γ A)
   βif-trueᴾ (ηTmᴾ T) (ηTmᴾ F)
     hom-map ηTmᴾ (Raw.βif-true T F)
βif-trueᴾ-η T F =
  Tmᴾ-isThin
    _
    _
    (βif-trueᴾ (ηTmᴾ T) (ηTmᴾ F))
    (hom-map ηTmᴾ (Raw.βif-true T F))

βif-falseᴾ-η :
  (T F : Raw.Tm Γ A)
   βif-falseᴾ (ηTmᴾ T) (ηTmᴾ F)
     hom-map ηTmᴾ (Raw.βif-false T F)
βif-falseᴾ-η T F =
  Tmᴾ-isThin
    _
    _
    (βif-falseᴾ (ηTmᴾ T) (ηTmᴾ F))
    (hom-map ηTmᴾ (Raw.βif-false T F))

β×₁ᴾ-η :
  (M : Raw.Tm Γ A) (N : Raw.Tm Γ B)
   β×₁ᴾ (ηTmᴾ M) (ηTmᴾ N)
     hom-map ηTmᴾ (Raw.β×₁ M N)
β×₁ᴾ-η M N =
  Tmᴾ-isThin
    _
    _
    (β×₁ᴾ (ηTmᴾ M) (ηTmᴾ N))
    (hom-map ηTmᴾ (Raw.β×₁ M N))

β×₂ᴾ-η :
  (M : Raw.Tm Γ A) (N : Raw.Tm Γ B)
   β×₂ᴾ (ηTmᴾ M) (ηTmᴾ N)
     hom-map ηTmᴾ (Raw.β×₂ M N)
β×₂ᴾ-η M N =
  Tmᴾ-isThin
    _
    _
    (β×₂ᴾ (ηTmᴾ M) (ηTmᴾ N))
    (hom-map ηTmᴾ (Raw.β×₂ M N))

η×ᴾ-η :
  (P : Raw.Tm Γ (A Raw.×ᵗʸ B))
   η×ᴾ (ηTmᴾ P)  hom-map ηTmᴾ (Raw.η× P)
η×ᴾ-η P =
  Tmᴾ-isThin
    _
    _
    (η×ᴾ (ηTmᴾ P))
    (hom-map ηTmᴾ (Raw.η× P))

β⇒ᴾ-η :
  (N : Raw.Tm (Γ Raw.▷ A) B) (M : Raw.Tm Γ A)
   β⇒ᴾ (ηTmᴾ N) (ηTmᴾ M)
     hom-map ηTmᴾ (Raw.β⇒ N M)
β⇒ᴾ-η N M =
  Tmᴾ-isThin
    _
    _
    (β⇒ᴾ (ηTmᴾ N) (ηTmᴾ M))
    (hom-map ηTmᴾ (Raw.β⇒ N M))

η⇒ᴾ-η :
  (F : Raw.Tm Γ (A Raw.⇒ᵗʸ B))
   η⇒ᴾ (ηTmᴾ F)  hom-map ηTmᴾ (Raw.η⇒ F)
η⇒ᴾ-η F =
  Tmᴾ-isThin
    _
    _
    (η⇒ᴾ (ηTmᴾ F))
    (hom-map ηTmᴾ (Raw.η⇒ F))