{-# OPTIONS --without-K #-}
module sets.nat.ordering.leq.level where

open import sum
open import equality
open import function.isomorphism
open import function.extensionality
open import hott.level
open import sets.nat.core
open import sets.nat.ordering.leq.core
open import container.core
open import container.w
open import sets.empty
open import sets.unit

open import hott.level.sets public
  using (nat-set)

module ≤-container where
  I : Set
  I =  × 

  A A₁ A₂ : I  Set
  A₁ (m , n) = m  0
  A₂ (m , n) = ( Σ I λ { (m' , n')
                m  suc m'
               × n  suc n' } )
  A i = A₁ i  A₂ i

  A₂-struct-iso :  m n
                 A₂ (m , n)
                 (¬ (m  0) × ¬ (n  0))
  A₂-struct-iso m n = iso f g α β
    where
      f :  {m n}  A₂ (m , n)  ¬ (m  0) × ¬ (n  0)
      f .{suc m}.{suc n}((m , n) , refl , refl) =  ()) ,  ())

      g :  {m n}  ¬ (m  0) × ¬ (n  0)  A₂ (m , n)
      g {m = zero} (u , v) = ⊥-elim (u refl)
      g {n = zero} (u , v) = ⊥-elim (v refl)
      g {suc m} {suc n} _ = ((m , n) , refl , refl)

      α :  {m n}(a : A₂ (m , n))  g (f a)  a
      α .{suc m}.{suc n}((m , n) , refl , refl) = refl

      β :  {m n}(u : ¬ (m  0) × ¬ (n  0))  f (g u)  u
      β {m = zero} (u , v) = ⊥-elim (u refl)
      β {n = zero} (u , v) = ⊥-elim (v refl)
      β {suc m} {suc n} _ = pair≡ (funext λ ()) (funext λ ())

  A₂-h1 :  i  h 1 (A₂ i)
  A₂-h1 (m , n) = iso-level (sym≅ (A₂-struct-iso m n))
    (×-level (Π-level λ _  ⊥-prop) (Π-level λ _  ⊥-prop))

  A-disj :  i  ¬ (A₁ i × A₂ i)
  A-disj (.zero , n) (refl , (m' , n') , () , pn)

  A-h1 :  i  h 1 (A i)
  A-h1 i = ⊎-h1 (nat-set _ zero) (A₂-h1 i) (A-disj i)

  B :  {i}  A i  Set
  B (inj₁ _) = 
  B (inj₂ _) = 

  r :  {i}{a : A i}  B a  I
  r {a = inj₁ _} ()
  r {a = inj₂ (mn' , _)} _ = mn'

  c : Container _ _ _
  c = container I A B r

open ≤-container using (c; A-h1)

≤-struct-iso :  {n m}
              n  m
              W c (n , m)
≤-struct-iso = iso f g α β
  where
    f :  {n m}  n  m  W c (n , m)
    f z≤n = sup (inj₁ refl)  ())
    f (s≤s p) = sup (inj₂ (_ , (refl , refl)))  _  f p)

    g :  {m n}  W c (m , n)  m  n
    g (sup (inj₁ refl) _) = z≤n
    g (sup (inj₂ ((m' , n') , (refl , refl))) u)
      = s≤s (g (u tt))

    α :  {n m}(p : n  m)  g (f p)  p
    α z≤n = refl
    α (s≤s p) = ap s≤s (α p)

    β :  {n m}(p : W c (m , n))  f (g p)  p
    β (sup (inj₁ refl) u) = ap (sup (inj₁ refl)) (funext λ ())
    β (sup (inj₂ ((m' , n') , (refl , refl))) u)
      = ap (sup _) (funext λ { tt  β (u tt) })

≤-level :  {m n}  h 1 (m  n)
≤-level {m}{n} = iso-level (sym≅ ≤-struct-iso) (w-level A-h1 (m , n))