{-# OPTIONS
  --without-K
  --prop
  --rewriting
  --confluence-check
  --postfix-projections
#-}

module TT.CwF-SSC-CwF where

open import TT.Lib
open import TT.CwF.Syntax
open import TT.CwF.Ind
open import TT.CwF-SSC
open import TT.SSC-CwF

module C→S→C where
  open DM
  open DModel

  M : DModel
  M .sorts .Conᴹ Γ = Liftₚ (S→Cᶜ (C→Sᶜ Γ)  Γ)
  M .sorts .Subᴹ (liftₚ Δᴹ) (liftₚ Γᴹ) γ =
    Liftₚ (T→C (C→T γ) ≡[ ap-Sub Δᴹ Γᴹ ] γ)
  M .sorts .Tyᴹ (liftₚ Γᴹ) i A = Liftₚ (S→Cᵀ (C→Sᵀ A) ≡[ ap-Ty Γᴹ ] A)
  M .sorts .Tmᴹ (liftₚ Γᴹ) (liftₚ Aᴹ) a =
    Liftₚ (S→Cᵗ (C→Sᵗ a) ≡[ ap-Tm₂ Γᴹ Aᴹ ] a)

  M .core ._∘ᴹ_ {Δᴹ = liftₚ Δᴹ} {Γᴹ = liftₚ Γᴹ} {γ = γ} {Θᴹ = liftₚ Θᴹ} (liftₚ γᴹ) (liftₚ δᴹ) .lowerₚ =
    dep (T→C-∘ (C→T γ)) ∙ᵈ apᵈ-∘ Δᴹ Γᴹ γᴹ Θᴹ δᴹ
  M .core .assocᴹ = refl

  M .core .idᴹ {Γ} {Γᴹ = liftₚ Γᴹ} .lowerₚ = dep (T→C-id (C→Sᶜ Γ)) ∙ᵈ apᵈ-id Γᴹ
  M .core .idrᴹ = refl
  M .core .idlᴹ = refl

  M .core ._[_]ᵀᴹ {Γᴹ = liftₚ Γᴹ} {Δᴹ = liftₚ Δᴹ} {γ} (liftₚ Aᴹ) (liftₚ γᴹ) .lowerₚ =
    dep (S→C-[]ᵀᵗ (C→T γ)) ∙ᵈ apᵈ-[]ᵀ Γᴹ Aᴹ Δᴹ γᴹ
  M .core .[]ᵀ-∘ᴹ = refl
  M .core .[]ᵀ-idᴹ = refl

  M .core ._[_]ᵗᴹ {Γᴹ = liftₚ Γᴹ} {Aᴹ = liftₚ Aᴹ} {Δᴹ = liftₚ Δᴹ} {γ = γ} (liftₚ aᴹ) (liftₚ γᴹ) .lowerₚ =
    S→C-[]ᵗᵗ (C→T γ) ∙ᵈ apᵈ-[]ᵗ₅ Γᴹ Aᴹ aᴹ Δᴹ γᴹ
  M .core .[]ᵗ-∘ᴹ = refl
  M .core .[]ᵗ-idᴹ = refl

  M .core .◇ᴹ .lowerₚ = refl
  M .core .εᴹ {Γ} {Γᴹ = liftₚ Γᴹ} .lowerₚ = dep (T→C-ε (C→Sᶜ Γ)) ∙ᵈ apᵈ-ε Γᴹ
  M .core .ε-∘ᴹ = refl
  M .core .◇-ηᴹ = refl

  M .core ._▹ᴹ_ (liftₚ Γᴹ) (liftₚ Aᴹ) .lowerₚ = ap-▹ Γᴹ Aᴹ
  M .core .pᴹ {Γᴹ = liftₚ Γᴹ} {i} {A} {Aᴹ = liftₚ Aᴹ} .lowerₚ =
    dep (T→C-p (C→Sᵀ A)) ∙ᵈ apᵈ-p₂ Γᴹ Aᴹ
  M .core .qᴹ {Γᴹ = liftₚ Γᴹ} {Aᴹ = liftₚ Aᴹ} .lowerₚ = splitl (apᵈ-q₂ Γᴹ Aᴹ)

  M .core ._,ᴹ_ {Δᴹ = liftₚ Δᴹ} {Γᴹ = liftₚ Γᴹ} {γ = γ} {Aᴹ = liftₚ Aᴹ} {a = a} (liftₚ γᴹ) (liftₚ aᴹ) .lowerₚ =
    dep (T→C-, (C→T γ) (C→Sᵗ a)) ∙ᵈ apᵈ-,₅ Δᴹ Γᴹ γᴹ Aᴹ (splitl aᴹ)
  M .core .,-∘ᴹ = refl

  M .core .▹-β₁ᴹ = refl
  M .core .▹-β₂ᴹ = refl
  M .core .▹-ηᴹ = refl

  M .types .Uᴹ {Γᴹ = liftₚ Γᴹ} i .lowerₚ = apᵈ-U Γᴹ
  M .types .U-[]ᴹ = refl

  M .types .Elᴹ {Γᴹ = liftₚ Γᴹ} (liftₚ αᴹ) .lowerₚ = apᵈ-El Γᴹ αᴹ
  M .types .El-[]ᴹ = refl

  M .types .cᴹ {Γᴹ = liftₚ Γᴹ} (liftₚ Aᴹ) .lowerₚ = apᵈ-c Γᴹ Aᴹ
  M .types .c-[]ᴹ = refl

  M .types .U-βᴹ = refl
  M .types .U-ηᴹ = refl

  M .types .Liftᴹ {Γᴹ = liftₚ Γᴹ} (liftₚ Aᴹ) .lowerₚ = apᵈ-Lift Γᴹ Aᴹ
  M .types .Lift-[]ᴹ = refl

  M .types .lowerᴹ {Γᴹ = liftₚ Γᴹ} {Aᴹ = liftₚ Aᴹ} (liftₚ aᴹ) .lowerₚ =
    apᵈ-lower Γᴹ Aᴹ aᴹ
  M .types .lower-[]ᴹ = refl

  M .types .liftᴹ {Γᴹ = liftₚ Γᴹ} {Aᴹ = liftₚ Aᴹ} (liftₚ aᴹ) .lowerₚ =
    apᵈ-lift Γᴹ Aᴹ aᴹ
  M .types .lift-[]ᴹ = refl

  M .types .Lift-βᴹ = refl
  M .types .Lift-ηᴹ = refl

  M .types .Πᴹ {Γᴹ = liftₚ Γᴹ} (liftₚ Aᴹ) (liftₚ Bᴹ) .lowerₚ = apᵈ-Π Γᴹ Aᴹ Bᴹ
  M .types .Π-[]ᴹ = refl

  M .types .appᴹ {Γᴹ = liftₚ Γᴹ} {Aᴹ = liftₚ Aᴹ} {Bᴹ = liftₚ Bᴹ} (liftₚ fᴹ) (liftₚ aᴹ) .lowerₚ =
    splitl (apᵈ-app Γᴹ Aᴹ Bᴹ fᴹ aᴹ)
  M .types .app-[]ᴹ = refl


  M .types .lamᴹ {Γᴹ = liftₚ Γᴹ} {Aᴹ = liftₚ Aᴹ} {Bᴹ = liftₚ Bᴹ} (liftₚ bᴹ) .lowerₚ =
    apᵈ-lam Γᴹ Aᴹ Bᴹ bᴹ
  M .types .lam-[]ᴹ = refl

  M .types .Π-βᴹ = refl
  M .types .Π-ηᴹ = refl

  open Ind M public

private variable
  i : 
  Γ Δ : Con
  γ : Sub Δ Γ
  A : Ty Γ i
  a : Tm Γ A

C→S→Cᶜ : S→Cᶜ (C→Sᶜ Γ)  Γ
C→S→Cᶜ {Γ = Γ} = C→S→C.⟦ Γ ⟧ᶜ .lowerₚ

C→T→C : T→C (C→T γ) ≡[ ap-Sub C→S→Cᶜ C→S→Cᶜ ] γ
C→T→C {γ = γ} = C→S→C.⟦ γ ⟧ˢ .lowerₚ

C→S→Cᵀ : S→Cᵀ (C→Sᵀ A) ≡[ ap-Ty C→S→Cᶜ ] A
C→S→Cᵀ {A = A} = C→S→C.⟦ A ⟧ᵀ .lowerₚ

C→S→Cᵗ : S→Cᵗ (C→Sᵗ a) ≡[ ap-Tm₂ C→S→Cᶜ C→S→Cᵀ ] a
C→S→Cᵗ {a = a} = C→S→C.⟦ a ⟧ᵗ .lowerₚ