open import Cubical.Foundations.Prelude hiding (Sub)
open import Cubical.Foundations.HLevels
open import Cubical.Data.Unit

module TT.Groupoid.SetInterp (X : hSet ℓ-zero) (Y : X .fst  hSet ℓ-zero) where

open import TT.Groupoid.Syntax X Y

⟦_⟧ₛ : Sort  Type₁
⟦_⟧ :  {S}  EL S   S ⟧ₛ

 con ⟧ₛ = hSet ℓ-zero
 sub Δ Γ ⟧ₛ = Lift ( Δ  .fst   Γ  .fst)
 ty Γ ⟧ₛ =  Γ  .fst  hSet ℓ-zero
 tm Γ A ⟧ₛ = Lift ((γ :  Γ  .fst)   A  γ .fst)

 isSetSub Δ Γ γ₀ γ₁ P₀ P₁ i j  =
  isOfHLevelLift 2 (isSetΠ λ δ   Γ  .snd)
     γ₀   γ₁ 
     j   P₀ j )  j   P₁ j )
    i j
 γ  δ  .lower θ =  γ  .lower ( δ  .lower θ)
 assoc γ δ θ i  .lower ξ =  γ  .lower ( δ  .lower ( θ  .lower ξ))
 id  .lower γ = γ
 idr γ i  .lower δ =  γ  .lower δ
 idl γ i  .lower δ =  γ  .lower δ

 isGroupoidTy Γ A₀ A₁ P₀ P₁ S₀ S₁ i j k  =
  isGroupoidΠ  γ  isGroupoidHSet)
     A₀   A₁ 
     j   P₀ j )  j   P₁ j )
     j k   S₀ j k )  j k   S₁ j k )
    i j k
 A [ γ ]ᵀ  δ =  A  ( γ  .lower δ)
 []ᵀ-∘ A γ δ i  θ =  A  ( γ  .lower ( δ  .lower θ))
 []ᵀ-id A i  γ =  A  γ

 isSetTm Γ A a₀ a₁ P₀ P₁ i j  =
  isOfHLevelLift 2 (isSetΠ λ γ   A  γ .snd)
     a₀   a₁ 
     j   P₀ j )  j   P₁ j )
    i j
 a [ γ ]ᵗ  .lower δ =  a  .lower ( γ  .lower δ)
 []ᵗ-∘ a γ δ i  .lower θ =  a  .lower ( γ  .lower ( δ  .lower θ))
 []ᵗ-id a i  .lower γ =  a  .lower γ

   = Unit , isSetUnit
 ε  .lower γ = tt
 ε-∘ γ i  .lower δ = tt
 ◇-η i  .lower tt = tt

 Γ  A  =
  (Σ[ γ   Γ  .fst ]  A  γ .fst) , isSetΣ ( Γ  .snd) λ γ   A  γ .snd
 p  .lower (γ , a) = γ
 q  .lower (γ , a) = a
 γ   .lower (δ , a) =  γ  .lower δ , a
  a   .lower γ = γ ,  a  .lower γ
 ⟨⟩-∘ a γ i  .lower δ =  γ  .lower δ ,  a  .lower ( γ  .lower δ)
 ▹-η i  .lower (γ , a) = γ , a

 ⁺-∘ γ δ i  .lower (θ , a) =  γ  .lower ( δ  .lower θ) , a
 []ᵀ-⁺-∘ B γ δ i  (θ , a) =  B  ( γ  .lower ( δ  .lower θ) , a)
 []ᵀ-⁺-∘-filler B γ δ i j  (θ , a) =  B  ( γ  .lower ( δ  .lower θ) , a)
 ⁺-id i  .lower (γ , a) = γ , a
 []ᵀ-⁺-id B i  (γ , a) =  B  (γ , a)
 []ᵀ-⁺-id-filler B i j  (γ , a) =  B  (γ , a)

 p-⁺ γ i  .lower (δ , a) =  γ  .lower δ
 []ᵀ-p-⁺ B γ i  (δ , a) =  B  ( γ  .lower δ)
 []ᵀ-p-⁺-filler B γ i j  (δ , a) =  B  ( γ  .lower δ)
 q-⁺ γ i  .lower (δ , a) = a
 p-⟨⟩ a i  .lower γ = γ
 []ᵀ-p-⟨⟩ B a i  γ =  B  γ
 []ᵀ-p-⟨⟩-filler B a i j  γ =  B  γ
 q-⟨⟩ a i  .lower γ =  a  .lower γ

 U  γ = X
 U-[] γ i  δ = X
 U-[]-∘ γ δ i j  =
  fill  j  _  hSet ℓ-zero) {φ = i  ~ i}  j _ ξ  X) (inS λ ξ  X) j
 U-[]-id i j  γ = X
  [ γ ]ᵘ  .lower δ =    .lower ( γ  .lower δ)
 []ᵘ-filler  γ i  .lower δ =    .lower ( γ  .lower δ)
 []ᵘ-∘  γ δ i  .lower θ =    .lower ( γ  .lower ( δ  .lower θ))
 []ᵘ-id  i  .lower γ =    .lower γ
 El   γ = Y (   .lower γ)
 El-[]  γ i  δ = Y (   .lower ( γ  .lower δ))
 El-[]-∘  γ δ i j  =
  fill  j  _  hSet ℓ-zero)
    {φ = i  ~ i}
     j _ θ  Y (   .lower ( γ  .lower ( δ  .lower θ))))
    (inS λ θ  Y (   .lower ( γ  .lower ( δ  .lower θ))))
    j
 El-[]-id  i j  γ = Y (   .lower γ)

 Π A B  γ =
  ((a :  A  γ .fst)   B  (γ , a) .fst) , isSetΠ λ a   B  (γ , a) .snd
 Π-[] A B γ i  δ =
  ((a :  A  ( γ  .lower δ) .fst)   B  ( γ  .lower δ , a) .fst) ,
  isSetΠ λ a   B  ( γ  .lower δ , a) .snd
 Π-[]-∘ A B γ δ i j  =
  fill  j  _  hSet ℓ-zero)
    {φ = i  ~ i}
     j _ θ 
      ( (a :  A  ( γ  .lower ( δ  .lower θ)) .fst) 
         B  ( γ  .lower ( δ  .lower θ) , a) .fst) ,
      isSetΠ λ a   B  ( γ  .lower ( δ  .lower θ) , a) .snd)
    (inS λ θ 
      ( (a :  A  ( γ  .lower ( δ  .lower θ)) .fst) 
         B  ( γ  .lower ( δ  .lower θ) , a) .fst) ,
      isSetΠ λ a   B  ( γ  .lower ( δ  .lower θ) , a) .snd)
    j
 Π-[]-id A B i j  γ =
  ((a :  A  γ .fst)   B  (γ , a) .fst) , isSetΠ λ a   B  (γ , a) .snd
 app f  .lower (γ , a) =  f  .lower γ a
 lam b  .lower γ a =  b  .lower (γ , a)
 lam-[] b γ i  .lower δ a =  b  .lower ( γ  .lower δ , a)
 Π-β b i  .lower (γ , a) =  b  .lower (γ , a)
 Π-η f i  .lower γ a =  f  .lower γ a

 in-X x  .lower tt = x
 in-Y y  .lower tt = y