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

module TT.SSC.Tel where

open import TT.Lib
open import TT.SSC.Syntax
open import TT.SSC.Path

private variable
  i i₀ i₁ : ℕ
  Γ Δ : Con
  A A₀ A₁ : Ty Γ i

infixl 2 _++_
data Tel (Γ : Con) : Set
_++_ : (Γ : Con) → Tel Γ → Con

infixl 2 _▹_
data Tel Γ where
  ◇ : Tel Γ
  _▹_ : (Ω : Tel Γ) → Ty (Γ ++ Ω) i → Tel Γ

Γ ++ ◇ = Γ
Γ ++ (Ω ▹ A) = (Γ ++ Ω) ▹ A

private variable
  Ω Ω₀ Ω₁ : Tel Γ

infixl 9 _[_]ᵀˡ
infixl 10 _⁺^
_[_]ᵀˡ : Tel Γ → Sub Δ Γ → Tel Δ
_⁺^ : (γ : Sub Δ Γ) → Sub (Δ ++ Ω [ γ ]ᵀˡ) (Γ ++ Ω)

◇ [ γ ]ᵀˡ = ◇
(Ω ▹ A) [ γ ]ᵀˡ = Ω [ γ ]ᵀˡ ▹ A [ γ ⁺^ ]ᵀ

_⁺^ {Ω = ◇} γ = γ
_⁺^ {Ω = Ω ▹ A} γ = γ ⁺^ ⁺

infixl 9 _[_]ᵀˡ*
infixl 10 _⁺^*
_[_]ᵀˡ* : Tel Γ → Sub* Δ Γ → Tel Δ
_⁺^* : (γ* : Sub* Δ Γ) → Sub* (Δ ++ Ω [ γ* ]ᵀˡ*) (Γ ++ Ω)

◇ [ γ* ]ᵀˡ* = ◇
(Ω ▹ A) [ γ* ]ᵀˡ* = Ω [ γ* ]ᵀˡ* ▹ A [ γ* ⁺^* ]ᵀ*

_⁺^* {Ω = ◇} γ* = γ*
_⁺^* {Ω = Ω ▹ A} γ* = γ* ⁺^* ⁺*

opaque
  unfolding coe

  ap-++ : Ω₀ ≡ Ω₁ → (Γ ++ Ω₀) ≡ (Γ ++ Ω₁)
  ap-++ refl = refl

  ap-▹ᵀˡ :
    (Ω₀₁ : Ω₀ ≡ Ω₁) → A₀ ≡[ ap-Ty (ap-++ Ω₀₁) ] A₁ → (Ω₀ ▹ A₀) ≡ (Ω₁ ▹ A₁)
  ap-▹ᵀˡ refl refl = refl

  ▹ᵀˡ-inj-Ω : (Ω₀ ▹ A₀) ≡ (Ω₁ ▹ A₁) → Ω₀ ≡ Ω₁
  ▹ᵀˡ-inj-Ω refl = refl

  ▹ᵀˡ-inj-i :
    {A₀ : Ty (Γ ++ Ω₀) i₀} {A₁ : Ty (Γ ++ Ω₁) i₁} →
    (Ω₀ ▹ A₀) ≡ (Ω₁ ▹ A₁) → i₀ ≡ i₁
  ▹ᵀˡ-inj-i refl = refl

  ▹ᵀˡ-inj-A :
    (e : (Ω₀ ▹ A₀) ≡ (Ω₁ ▹ A₁)) →
    A₀ ≡[ ap-Ty₂ (ap-++ (▹ᵀˡ-inj-Ω e)) (▹ᵀˡ-inj-i e) ] A₁
  ▹ᵀˡ-inj-A refl = refl