text editor inspired vim and yi
-- SPDX-FileCopyrightText: 2026 Yuki Otsuka
--
-- SPDX-License-Identifier: BSD-3

import ViE.Data.PieceTable.Invariant

namespace Proof.PieceTable

open ViE

theorem bplusInvariant_empty : ViE.PieceTree.bplusInvariant ViE.PieceTree.empty := by
  simpa using ViE.PieceTree.bplusInvariant_empty

theorem bplusInvariant_leaf
    (pieces : Array ViE.Piece) (s : ViE.Stats) (m : ViE.SearchBloom)
    (hsize : pieces.size ≤ ViE.NodeCapacity) :
    ViE.PieceTree.bplusInvariant (.leaf pieces s m) := by
  simpa using ViE.PieceTree.bplusInvariant_leaf pieces s m hsize

theorem bplusInvariant_mkLeaf
    (pieces : Array ViE.Piece) (pt : ViE.PieceTable)
    (hsize : pieces.size ≤ ViE.NodeCapacity) :
    ViE.PieceTree.bplusInvariant (ViE.PieceTree.mkLeaf pieces pt) := by
  unfold ViE.PieceTree.mkLeaf
  by_cases hempty : pieces.size = 0
  · simp [hempty, bplusInvariant_empty]
  ·
    let s := pieces.foldl (fun acc p => acc + (ViE.Stats.ofPiece p)) ViE.Stats.empty
    let m := ViE.PieceTree.buildBloomForPieces pieces pt
    have hleaf : ViE.PieceTree.bplusInvariant (ViE.PieceTree.leaf pieces s m) := by
      simpa [s, m] using bplusInvariant_leaf pieces s m hsize
    simp [hempty, s, m, hleaf]

theorem bplusInvariant_intro
    (t : ViE.PieceTree)
    (hArity : ViE.PieceTree.validNodeArity t true)
    (hDepth : ViE.PieceTree.uniformLeafDepth t)
    (hMeta : ViE.PieceTree.internalMetaWellFormed t) :
    ViE.PieceTree.bplusInvariant t := by
  simpa using ViE.PieceTree.bplusInvariant_intro t hArity hDepth hMeta

theorem bplusInvariant_validNodeArity
    (t : ViE.PieceTree)
    (h : ViE.PieceTree.bplusInvariant t) :
    ViE.PieceTree.validNodeArity t true := by
  simpa using ViE.PieceTree.bplusInvariant_validNodeArity t h

theorem bplusInvariant_uniformLeafDepth
    (t : ViE.PieceTree)
    (h : ViE.PieceTree.bplusInvariant t) :
    ViE.PieceTree.uniformLeafDepth t := by
  simpa using ViE.PieceTree.bplusInvariant_uniformLeafDepth t h

theorem bplusInvariant_internalMetaWellFormed
    (t : ViE.PieceTree)
    (h : ViE.PieceTree.bplusInvariant t) :
    ViE.PieceTree.internalMetaWellFormed t := by
  simpa using ViE.PieceTree.bplusInvariant_internalMetaWellFormed t h

theorem validNodeArity_mkInternal_root_of_eq
    (children : Array ViE.PieceTree)
    (vc : Array ViE.PieceTree) (s : ViE.Stats) (sm : ViE.SearchBloom) (im : ViE.InternalMeta)
    (heq : ViE.PieceTree.mkInternal children = ViE.PieceTree.internal vc s sm im)
    (hsize : 1 ≤ vc.size ∧ vc.size ≤ ViE.NodeCapacity)
    (hchildren : ViE.PieceTree.validNodeArityList vc.toList) :
    ViE.PieceTree.validNodeArity (ViE.PieceTree.mkInternal children) true := by
  rw [heq]
  simp [ViE.PieceTree.validNodeArity, hsize, hchildren]

theorem validNodeArity_mkInternal_nonroot_of_eq
    (children : Array ViE.PieceTree)
    (vc : Array ViE.PieceTree) (s : ViE.Stats) (sm : ViE.SearchBloom) (im : ViE.InternalMeta)
    (heq : ViE.PieceTree.mkInternal children = ViE.PieceTree.internal vc s sm im)
    (hsize : 2 ≤ vc.size ∧ vc.size ≤ ViE.NodeCapacity)
    (hchildren : ViE.PieceTree.validNodeArityList vc.toList) :
    ViE.PieceTree.validNodeArity (ViE.PieceTree.mkInternal children) false := by
  rw [heq]
  simp [ViE.PieceTree.validNodeArity, hsize, hchildren]

end Proof.PieceTable