{-# OPTIONS --cubical #-}

open import ContainersPlus
open import MndContainer as MC
open MC.MndContainer

open import Level renaming (suc to lsuc ; zero to lzero)
open import Cubical.Foundations.Prelude hiding (_◁_) renaming (fst to π₁ ; snd to π₂)
open import Cubical.Foundations.Function
open import Cubical.Data.Sigma

record IsMndContainerMorphism (ℓs ℓp ℓs' ℓp' : Level) (S : Set ℓs) (P : S → Set ℓp) (T : Set ℓs') (Q : T → Set ℓp')
                              (Aₘ : MndContainer _ _ (S ◁ P)) 
                              (Bₘ : MndContainer _ _ (T ◁ Q))
                              (shapeₘ : S → T) (positionₘ : {s : S} → Q (shapeₘ s) → P s) : 
                              Set (lsuc (ℓs ⊔ ℓp ⊔ ℓs' ⊔ ℓp')) where
  field
    ι-pres : shapeₘ (ι Aₘ) ≡ ι Bₘ
    σ-pres : (s : S) (f : P s → S) → shapeₘ (σ Aₘ s f) ≡ σ Bₘ (shapeₘ s) (shapeₘ ∘ f ∘ positionₘ)
    pr₁-pres : (s : S) (f : P s → S) →
               PathP (λ i → Q (σ-pres s f i) → P s)
                     (λ q → pr₁ Aₘ s f (positionₘ q))
                     (λ q → positionₘ (pr₁ Bₘ (shapeₘ s) (shapeₘ ∘ f ∘ positionₘ) q))
    pr₂-pres : (s : S) (f : P s → S) →
               PathP (λ i → (q : Q (σ-pres s f i)) → P (f (pr₁-pres s f i q)))
                     (λ q → pr₂ Aₘ s f (positionₘ q))
                     (λ q → positionₘ (pr₂ Bₘ (shapeₘ s) (shapeₘ ∘ f ∘ positionₘ) q))


record MndContainerMorphism (ℓs ℓp : Level) (S : Set ℓs) (P : S → Set ℓp) (T : Set ℓs) (Q : T → Set ℓp)
                            (Aₘ : MndContainer _ _ (S ◁ P)) 
                            (Bₘ : MndContainer _ _ (T ◁ Q)) : Set (lsuc (ℓs ⊔ ℓp)) where
  field
    shapeₘ : S → T
    positionₘ : {s : S} → Q (shapeₘ s) → P s 
    isMCMorphism : IsMndContainerMorphism _ _ _ _ S P T Q Aₘ Bₘ shapeₘ positionₘ