{-# OPTIONS --safe #-}
module Cubical.Categories.Profunctor.Morphism where

-- open import Cubical.Foundations.Prelude hiding (Path)
-- open import Cubical.Foundations.Structure
-- open import Cubical.Foundations.HLevels
-- open import Cubical.Foundations.Isomorphism
-- open import Cubical.Categories.Category
-- open import Cubical.Categories.Functor
-- open import Cubical.Categories.Constructions.BinProduct
-- open import Cubical.Categories.NaturalTransformation
-- open import Cubical.Categories.Profunctor.General
-- open import Cubical.Data.Sigma
-- open import Cubical.Reflection.RecordEquiv

-- open import Cubical.Categories.Instances.Sets
-- open import Cubical.Categories.Instances.Sets.More

-- private
--   variable
--     ℓb ℓb' ℓc ℓc' ℓd ℓd' ℓe ℓe' ℓp ℓr : Level

-- open NatTrans
-- open Iso

-- -- Square in a double category of functors and profunctors
-- module _ {B : Category ℓb ℓb'}{C : Category ℓc ℓc'}
--          {D : Category ℓd ℓd'}{E : Category ℓe ℓe'}
--          (P : B o-[ ℓp ]-* C) (F : Functor B D)
--          (G : Functor C E) (R : D o-[ ℓr ]-* E) where
--   record ProfHom : Type ((ℓ-max (ℓ-max (ℓ-max (ℓ-max
--                           (ℓ-max ℓb ℓb') ℓc) ℓc') ℓp) ℓr)) where
--     field
--       R-hom : ∀ b c → ⟨ P ⟅ b , c ⟆ ⟩ → ⟨ R ⟅ F ⟅ b ⟆ , G ⟅ c ⟆ ⟆ ⟩
--       R-nat : ∀ b' b c c' → (f : B [ b' , b ])
--               (p : ⟨ P ⟅ b , c ⟆ ⟩) (g : C [ c , c' ]) →
--             R-hom _ _ ((P ⟪ f , g ⟫) p) ≡
--               (R ⟪ F ⟪ f ⟫ , G ⟪ g ⟫ ⟫) (R-hom _ _ p)

--     R-homI : ∀ {b c} → ⟨ P ⟅ b , c ⟆ ⟩ → ⟨ R ⟅ F ⟅ b ⟆ , G ⟅ c ⟆ ⟆ ⟩
--     R-homI = R-hom _ _
--     R-natI : ∀ {b' b c c'} →
--       (f : B [ b' , b ]) (p : ⟨ P ⟅ b , c ⟆ ⟩) (g : C [ c , c' ]) →
--             R-hom _ _ ((P ⟪ f , g ⟫) p) ≡
--               (R ⟪ F ⟪ f ⟫ , G ⟪ g ⟫ ⟫) (R-hom _ _ p)
--     R-natI = R-nat _ _ _ _

--   open ProfHom
--   unquoteDecl ProfHomIsoΣ = declareRecordIsoΣ ProfHomIsoΣ (quote ProfHom)
--   ProfHom≡ : ∀ ph ph' → (ph .R-hom ≡ ph' .R-hom) → ph ≡ ph'
--   ProfHom≡ ph ph' path =
--     isoFunInjective ProfHomIsoΣ ph ph'
--       (Σ≡Prop (λ f → isPropΠ6
--         (λ a b c d e f' → isPropΠ λ g → (R ⟅ _ , _ ⟆) .snd _ _)) path)

--   ProfHomNT : Type (ℓ-max (ℓ-max
  --   (ℓ-max (ℓ-max (ℓ-max ℓb ℓb') ℓc) ℓc') ℓp) ℓr)
--   ProfHomNT =
--     NatTrans (LiftF {ℓp} {ℓr} ∘F P) (LiftF {ℓr} {ℓp} ∘F R ∘F ((F ^opF) ×F G))

--   ProfHom→NT : ProfHom → ProfHomNT
--   ProfHom→NT ph .N-ob (b , c) f = lift (R-homI ph (f .lower))
--   ProfHom→NT ph .N-hom f = funExt λ g → cong lift (R-natI ph _ _ _)

--   NT→ProfHom : ProfHomNT → ProfHom
--   NT→ProfHom α .R-hom _ _ p = α .N-ob _ (lift p) .lower
--   NT→ProfHom α .R-nat _ _ _ _ f p g =
--     cong lower (λ i → (α .N-hom (f , g) i) (lift p) )

--   ProfHomIsoNT : Iso ProfHom ProfHomNT
--   ProfHomIsoNT .fun = ProfHom→NT
--   ProfHomIsoNT .inv = NT→ProfHom
--   ProfHomIsoNT .leftInv ph = ProfHom≡ _ _ refl
--   ProfHomIsoNT .rightInv α = makeNatTransPath refl