module GpdCont.TwoCategory.StrictFunctor.Base where
open import GpdCont.Prelude
open import GpdCont.TwoCategory.Base
import      Cubical.Foundations.Path as Path
import      Cubical.Foundations.GroupoidLaws as GL
module _ {ℓo ℓo′ ℓh ℓh′ ℓr ℓr′}
  (C : TwoCategory ℓo ℓh ℓr)
  (D : TwoCategory ℓo′ ℓh′ ℓr′)
  where
    private
      ℓ = ℓ-max (ℓ-max ℓo (ℓ-max ℓh ℓr)) (ℓ-max ℓo′ (ℓ-max ℓh′ ℓr′))
      module C = TwoCategory C
      module D = TwoCategory D
    record StrictFunctor : Type ℓ where
      no-eta-equality
      field
        F-ob : C.ob → D.ob
        F-hom : {x y : C.ob} → C.hom x y → D.hom (F-ob x) (F-ob y)
        F-rel : {x y : C.ob} {f g : C.hom x y} → C.rel f g → D.rel (F-hom f) (F-hom g)
      ₀ = F-ob
      ₁ = F-hom
      ₂ = F-rel
      
      field
        F-rel-id : {x y : C.ob} {f : C.hom x y}
          → F-rel (C.id-rel f) ≡ D.id-rel (F-hom f)
        F-rel-trans : {x y : C.ob} {f g h : C.hom x y}
          → (r : C.rel f g)
          → (s : C.rel g h)
          → F-rel (r C.∙ᵥ s) ≡ (F-rel r) D.∙ᵥ (F-rel s)
      
      field
        
        F-hom-comp : {x y z : C.ob} (f : C.hom x y) (g : C.hom y z)
          → (F-hom f D.∙₁ F-hom g) ≡ (F-hom (f C.∙₁ g))
        F-hom-id : (x : C.ob) → D.id-hom (F-ob x) ≡ F-hom (C.id-hom x)
      field
        
        
        
        
        
        
        
        
        
        F-assoc-filler-left : {x y z w : C.ob} (f : C.hom x y) (g : C.hom y z) (h : C.hom z w)
          → PathCompFiller (cong (D._∙₁ F-hom h) (F-hom-comp f g)) (F-hom-comp (f C.∙₁ g) h)
        F-assoc-filler-right : {x y z w : C.ob} (f : C.hom x y) (g : C.hom y z) (h : C.hom z w)
          → PathCompFiller (cong (F-hom f D.∙₁_) (F-hom-comp g h)) (F-hom-comp f (g C.∙₁ h))
        F-assoc : {x y z w : C.ob} (f : C.hom x y) (g : C.hom y z) (h : C.hom z w)
          → PathP (λ i → D.comp-hom-assoc (F-hom f) (F-hom g) (F-hom h) i ≡ F-hom (C.comp-hom-assoc f g h i))
            (F-assoc-filler-left f g h .fst)
            (F-assoc-filler-right f g h .fst)
        
        
        
        
        
        F-unit-left-filler : {x y : C.ob} (f : C.hom x y)
          → PathCompFiller (cong (D._∙₁ F-hom f) (F-hom-id x)) (F-hom-comp (C.id-hom x) f)
        F-unit-left : {x y : C.ob} (f : C.hom x y)
          → PathP (λ i → D.comp-hom-unit-left (F-hom f) i ≡ F-hom (C.comp-hom-unit-left f i))
            (F-unit-left-filler f .fst)
            (refl′ (F-hom f))
        
        F-unit-right-filler : {x y : C.ob} (f : C.hom x y)
          → PathCompFiller (cong (F-hom f D.∙₁_) (F-hom-id y)) (F-hom-comp f (C.id-hom y))
        F-unit-right : {x y : C.ob} (f : C.hom x y)
          → PathP (λ i → D.comp-hom-unit-right (F-hom f) i ≡ F-hom (C.comp-hom-unit-right f i))
              (F-unit-right-filler f .fst)
              (refl′ (F-hom f))
module _ {ℓo ℓh ℓr}
  (C : TwoCategory ℓo ℓh ℓr)
  where
  private
    module C = TwoCategory C
  idStrictFunctor : StrictFunctor C C
  idStrictFunctor .StrictFunctor.F-ob = id _
  idStrictFunctor .StrictFunctor.F-hom = id _
  idStrictFunctor .StrictFunctor.F-rel = id _
  idStrictFunctor .StrictFunctor.F-rel-id = refl
  idStrictFunctor .StrictFunctor.F-rel-trans r s = refl
  idStrictFunctor .StrictFunctor.F-hom-comp f g = refl
  idStrictFunctor .StrictFunctor.F-hom-id x = refl
  idStrictFunctor .StrictFunctor.F-assoc-filler-left f g h .fst = refl′ (C.comp-hom (C.comp-hom f g) h)
  idStrictFunctor .StrictFunctor.F-assoc-filler-left f g h .snd = refl
  idStrictFunctor .StrictFunctor.F-assoc-filler-right f g h .fst = refl′ (C.comp-hom f (C.comp-hom g h))
  idStrictFunctor .StrictFunctor.F-assoc-filler-right f g h .snd = refl
  idStrictFunctor .StrictFunctor.F-assoc f g h = λ i j → C.comp-hom-assoc f g h i
  idStrictFunctor .StrictFunctor.F-unit-left-filler f = refl , refl
  idStrictFunctor .StrictFunctor.F-unit-left f i j = C.comp-hom-unit-left f i
  idStrictFunctor .StrictFunctor.F-unit-right-filler f = refl , refl
  idStrictFunctor .StrictFunctor.F-unit-right f = λ i j → C.comp-hom-unit-right f i
private
  variable
    ℓo ℓh ℓr : Level
    C D E : TwoCategory ℓo ℓh ℓr
module _
  (F : StrictFunctor C D)
  (G : StrictFunctor D E)
  where
  private
    module C = TwoCategory C
    module D = TwoCategory D
    module E = TwoCategory E
    module F = StrictFunctor F
    module G = StrictFunctor G
  compStrictFunctor : StrictFunctor C E
  compStrictFunctor .StrictFunctor.F-ob = F.F-ob ⋆ G.F-ob
  compStrictFunctor .StrictFunctor.F-hom = F.F-hom ⋆ G.F-hom
  compStrictFunctor .StrictFunctor.F-rel = F.F-rel ⋆ G.F-rel
  compStrictFunctor .StrictFunctor.F-rel-id = cong G.F-rel F.F-rel-id ∙ G.F-rel-id
  compStrictFunctor .StrictFunctor.F-rel-trans r s = cong G.F-rel (F.F-rel-trans r s) ∙ G.F-rel-trans (F.F-rel r) (F.F-rel s)
  compStrictFunctor .StrictFunctor.F-hom-comp f g = G.F-hom-comp (F.F-hom f) (F.F-hom g) ∙ cong G.F-hom (F.F-hom-comp f g)
  compStrictFunctor .StrictFunctor.F-hom-id x = G.F-hom-id (F.F-ob x) ∙ cong G.F-hom (F.F-hom-id x)
  compStrictFunctor .StrictFunctor.F-assoc-filler-left f g h = comp-assoc-filler-left where
    postulate
      comp-assoc-filler-left : PathCompFiller
        (cong (E._∙₁ G.F-hom (F.F-hom h)) (G.F-hom-comp (F.F-hom f) (F.F-hom g) ∙ (cong G.F-hom (F.F-hom-comp f g))))
        (G.F-hom-comp (F.F-hom (f C.∙₁ g)) (F.F-hom h) ∙ (cong G.F-hom (F.F-hom-comp (f C.∙₁ g) h)))
  compStrictFunctor .StrictFunctor.F-assoc-filler-right f g h = comp-assoc-filler-right where
    postulate
      comp-assoc-filler-right : PathCompFiller
        (cong (E._∙₁_ (G.F-hom (F.F-hom f))) (G.F-hom-comp (F.F-hom g) (F.F-hom h) ∙ (cong G.F-hom (F.F-hom-comp g h))))
        (G.F-hom-comp (F.F-hom f) (F.F-hom (g C.∙₁ h)) ∙ (cong G.F-hom (F.F-hom-comp f (g C.∙₁ h))))
  compStrictFunctor .StrictFunctor.F-assoc f g h = comp-assoc where
    postulate
      comp-assoc : PathP
        (λ i → E.comp-hom-assoc (G.F-hom (F.F-hom f)) (G.F-hom (F.F-hom g)) (G.F-hom (F.F-hom h)) i ≡ G.F-hom (F.F-hom (C.comp-hom-assoc f g h i)))
        (compStrictFunctor .StrictFunctor.F-assoc-filler-left f g h .fst)
        (compStrictFunctor .StrictFunctor.F-assoc-filler-right f g h .fst)
  compStrictFunctor .StrictFunctor.F-unit-left-filler {x} f = comp-unit-left-filler where
    postulate
      comp-unit-left-filler : PathCompFiller
        (cong (E._∙₁ G.F-hom (F.F-hom f)) (G.F-hom-id (F.F-ob x) ∙ (cong G.F-hom (F.F-hom-id x))))
        (G.F-hom-comp (F.F-hom (C.id-hom x)) (F.F-hom f) ∙ (cong G.F-hom (F.F-hom-comp (C.id-hom x) f)))
  compStrictFunctor .StrictFunctor.F-unit-left f = comp-unit-left where
    postulate
      comp-unit-left : PathP
        (λ i → E.comp-hom-unit-left (G.F-hom (F.F-hom f)) i ≡ G.F-hom (F.F-hom (C.comp-hom-unit-left f i)))
        (compStrictFunctor .StrictFunctor.F-unit-left-filler f .fst)
        refl
  compStrictFunctor .StrictFunctor.F-unit-right-filler {y} f = comp-unit-right-filler where
    postulate
      comp-unit-right-filler : PathCompFiller
        (cong (E._∙₁_ (G.F-hom (F.F-hom f))) (G.F-hom-id (F.F-ob y) ∙ (cong G.F-hom (F.F-hom-id y))))
        (G.F-hom-comp (F.F-hom f) (F.F-hom (C.id-hom y)) ∙ (cong G.F-hom (F.F-hom-comp f (C.id-hom y))))
  compStrictFunctor .StrictFunctor.F-unit-right f = comp-unit-right where
    postulate
      comp-unit-right : PathP
        (λ i → E.comp-hom-unit-right (G.F-hom (F.F-hom f)) i ≡ G.F-hom (F.F-hom (C.comp-hom-unit-right f i)))
        (compStrictFunctor .StrictFunctor.F-unit-right-filler f .fst)
        refl