{-# OPTIONS --without-K --exact-split --rewriting #-}

module Pi.FSMG.UFin where

open import lib.Base
open import lib.NType
open import lib.NType2
open import lib.Equivalence
open import lib.Univalence
open import lib.types.Sigma
open import lib.types.Truncation
open import lib.types.BAut
open import lib.types.Nat
open import lib.types.Fin
open import lib.types.Pi
open import lib.types.Coproduct
open import homotopy.FinSet public

UFin :  {i}  Type i  Type (lmax (lsucc lzero) i)
UFin A = Σ FinSet λ X  X .fst  A

open import Pi.FSMG.SMG
open import Pi.UFin.BAut

open import Pi.Common.Extra

instance
  BAut-Fin-level : {n : }  has-level 1 (BAut (Fin n))
  BAut-Fin-level = BAut-level {{Fin-is-set}}

  FinSet-exp-level : has-level 1 FinSet-exp
  FinSet-exp-level = Σ-level ⟨⟩ λ n  BAut-Fin-level

  FinSet-level : has-level 1 FinSet
  FinSet-level = equiv-preserves-level FinSet-econv {{FinSet-exp-level}}

FinSet-fst-level : (X : FinSet)  is-set (X .fst)
FinSet-fst-level (X , ϕ) = Trunc-elim  p  transport is-set (p .snd) Fin-is-set) ϕ

module _ {i} (A : Type i) {{_ : has-level 1 A}} where

  instance
    UFin-level : has-level 1 (UFin A)
    UFin-level = Σ-level FinSet-level λ X  ⟨⟩

  I : UFin A
  I = FinFS 0 , ⊥-elim  –> Fin-equiv-Empty

  Fin+ : (m n : )  Fin (m + n)  Fin m  Fin n
  Fin+ O n = TODO
  Fin+ (S m) n = TODO

  _∪_ : FinSet  FinSet  FinSet
  (X , ϕ)  (Y , ψ) = X  Y , TODO

  _⊗_ : UFin A  UFin A  UFin A
  (X , F)  (Y , G) = (X  Y) , TODO

  UFin-SMGStructure : SMGStructure (UFin A) {{UFin-level}}
  SMGStructure.I UFin-SMGStructure = I
  SMGStructure._⊗_ UFin-SMGStructure X Y = X  Y
  SMGStructure.α UFin-SMGStructure = TODO
  SMGStructure.Λ UFin-SMGStructure = TODO
  SMGStructure.ρ UFin-SMGStructure = TODO
  SMGStructure.β UFin-SMGStructure = TODO
  SMGStructure.⬠ UFin-SMGStructure = TODO
  SMGStructure.▽ UFin-SMGStructure = TODO
  SMGStructure.⬡ UFin-SMGStructure = TODO
  SMGStructure.β² UFin-SMGStructure = TODO