--import Mathlib.Algebra.BigOperators.Basic
import Mathlib.LinearAlgebra.TensorProduct.Basic
import Mathlib.Analysis.InnerProductSpace.Basic
import Mathlib.Analysis.InnerProductSpace.Dual
import Mathlib.Analysis.InnerProductSpace.PiL2

open BigOperators
open Finset
open scoped TensorProduct

variable {E : Type*} [NormedAddCommGroup E] [InnerProductSpace ℝ E] [FiniteDimensional ℝ E]
variable {F : Type*} [NormedAddCommGroup F] [NormedSpace ℝ F]



lemma OrthonormalBasis.sum_repr'
  {𝕜 : Type*} [RCLike 𝕜]
  {E : Type*} [NormedAddCommGroup E] [InnerProductSpace 𝕜 E]
  [Fintype ι]
  (b : OrthonormalBasis ι 𝕜 E)
  (v : E) :
  v = ∑ i, ⟪b i, v⟫_𝕜 • (b i) := by
  nth_rw 1 [← (b.sum_repr v)]
  simp_rw [b.repr_apply_apply v]


noncomputable def InnerProductSpace.canonicalTensor
  (E : Type u_2) [NormedAddCommGroup E] [InnerProductSpace ℝ E] [FiniteDimensional ℝ E] 
  : E ⊗[ℝ] E := by
  let v := stdOrthonormalBasis ℝ E
  exact ∑ i, (v i) ⊗ₜ[ℝ] (v i)


theorem InnerProductSpace.InvariantTensor
  (E : Type*) [NormedAddCommGroup E] [InnerProductSpace ℝ E] [FiniteDimensional ℝ E]
  (v₂ : OrthonormalBasis (Fin (FiniteDimensional.finrank ℝ E)) ℝ E)
  : InnerProductSpace.canonicalTensor E = ∑ i, (v₂ i) ⊗ₜ[ℝ] (v₂ i) := by

  unfold InnerProductSpace.canonicalTensor

  let v₁ := stdOrthonormalBasis ℝ E
  simp

  conv =>
    right
    arg 2
    intro i
    rw [v₁.sum_repr' (v₂ i)]
  simp_rw [TensorProduct.sum_tmul, TensorProduct.tmul_sum, TensorProduct.smul_tmul_smul]
  
  conv =>
    right
    rw [Finset.sum_comm]
    arg 2
    intro y
    rw [Finset.sum_comm]
    arg 2
    intro x
    rw [← Finset.sum_smul]
    arg 1
    arg 2
    intro i
    rw [← real_inner_comm (v₁ x)]
  simp_rw [OrthonormalBasis.sum_inner_mul_inner v₂]

  have xx {r₀ : Fin (FiniteDimensional.finrank ℝ E)} : ∀ r₁ : Fin (FiniteDimensional.finrank ℝ E), r₁ ≠ r₀ → ⟪v₁ r₀, v₁ r₁⟫_ℝ • v₁ r₀ ⊗ₜ[ℝ] v₁ r₁ = 0 := by
    intro r₁ hr₁
    rw [orthonormal_iff_ite.1 v₁.orthonormal]
    simp
    tauto
  simp_rw [Fintype.sum_eq_single _ xx]
  simp_rw [orthonormal_iff_ite.1 v₁.orthonormal]
  simp
