#!/usr/bin/env bash
# Laboratorio de la semana 1, paso a paso y sin GitHub: dos estudiantes, Ana y
# Bruno, cambian el mismo mensaje de error de Kallpa en dos ramas. El pull
# request de Ana se fusiona primero; Bruno trae main a su rama, encuentra el
# conflicto, lo resuelve y su pull request se fusiona después.
#
#   ./team-git.sh build/equipo     arma todo dentro de build/equipo
#
# Un repositorio "bare" (sin carpeta de trabajo) hace de GitHub: es a donde
# los dos suben y de donde traen los cambios. Los merges que en GitHub hace el
# botón "Merge pull request" se hacen aquí con `git merge --no-ff`, que es lo
# que ese botón hace por omisión. Los nombres, correos y fechas de los commits
# son fijos, así que los hashes salen siempre iguales.
set -euo pipefail

DIR="${1:?Uso: ./team-git.sh <carpeta>}"
KALLPA="${KALLPA:-$(cd "$(dirname "$0")/../../kallpa" && pwd)}"
FILE=src/domain/booking.ts
OLD="'Esa hora ya pasó.'"

rm -rf "$DIR"
mkdir -p "$DIR"
DIR="$(cd "$DIR" && pwd)"
export GIT_CONFIG_GLOBAL="$DIR/gitconfig"   # no usar el ~/.gitconfig de nadie
git config --global init.defaultBranch main
git config --global advice.detachedHead false
git config --global safe.directory '*'

# Quién hace cada paso y a qué hora (la hora de Lima del laboratorio).
as() {
  local who="$1" when="$2"
  export GIT_AUTHOR_NAME="$who" GIT_COMMITTER_NAME="$who"
  WHO="$(echo "${who%% *}" | tr '[:upper:]' '[:lower:]')"
  export GIT_AUTHOR_EMAIL="$WHO@uni.example" GIT_COMMITTER_EMAIL="$WHO@uni.example"
  export GIT_AUTHOR_DATE="2026-03-25T$when:00-05:00" GIT_COMMITTER_DATE="2026-03-25T$when:00-05:00"
  cd "$DIR/$WHO"
}

# Muestra el comando y su salida, como en la terminal.
run() {
  local shown="" arg
  for arg in "$@"; do
    case "$arg" in *" "*) arg="\"$arg\"" ;; esac
    shown="$shown $arg"
  done
  printf '%s$%s\n' "$WHO" "$shown"
  "$@" 2>&1
}

step() { printf '\n## %s\n' "$*"; }

step "GitHub: un repositorio vacío"
git init --quiet --bare "$DIR/github/kallpa.git"

step "Ana sube su copia de Kallpa"
mkdir -p "$DIR/ana"
cp -r "$KALLPA" "$DIR/ana/kallpa"
rm -rf "$DIR/ana/kallpa/node_modules" "$DIR/ana/kallpa"/data/*.db*
as "Ana Quispe" 10:00
cd kallpa
run git init --quiet
run git add -A
run git commit --quiet -m "Versión inicial de Kallpa"
run git remote add origin "$DIR/github/kallpa.git"
run git push --quiet -u origin main

step "Bruno clona el repositorio"
mkdir -p "$DIR/bruno"
as "Bruno Rojas" 10:05
run git clone --quiet "$DIR/github/kallpa.git" kallpa
cd kallpa
run git log --oneline --decorate

step "Ana: una rama y un commit"
as "Ana Quispe" 10:10
cd kallpa
run git switch -c mensaje-hora-pasada
sed -i "s/$OLD/'Esa hora ya pasó: elijan una hora libre.'/" "$FILE"
run git diff
run git commit -am "Sugiere elegir otra hora cuando la hora ya pasó"
run git push -u origin mensaje-hora-pasada

step "Bruno: otra rama, la misma línea"
as "Bruno Rojas" 10:12
cd kallpa
run git switch -c mensaje-hora-iniciada
sed -i "s/$OLD/'No se puede reservar una hora que ya empezó.'/" "$FILE"
run git commit -am "Aclara que tampoco se reserva una hora ya empezada"
run git push -u origin mensaje-hora-iniciada

step "Se fusiona el pull request de Ana"
as "Ana Quispe" 10:30
cd kallpa
run git switch main
run git merge --no-ff mensaje-hora-pasada -m "Merge pull request #1 from ana/mensaje-hora-pasada"
run git push origin main
run git cat-file -p HEAD

step "Bruno trae main a su rama: conflicto"
as "Bruno Rojas" 10:40
cd kallpa
run git fetch origin
run git log --oneline --graph --decorate --all
run git merge origin/main || true
run git status
run sed -n 64,70p "$FILE"

step "Bruno resuelve el conflicto"
sed -i "/^<<<<<<< /,/^>>>>>>> /c\\    return { code: 'IN_THE_PAST', message: 'Esa hora ya empezó: elijan una hora libre.' };" "$FILE"
run sed -n 64,66p "$FILE"
run git add "$FILE"
run git commit --no-edit
run git push origin mensaje-hora-iniciada

step "Se fusiona el pull request de Bruno"
as "Ana Quispe" 10:50
cd kallpa
run git switch main
run git fetch --quiet origin
run git merge --no-ff origin/mensaje-hora-iniciada -m "Merge pull request #2 from ana/mensaje-hora-iniciada"
run git push origin main

step "La historia de main"
run git log --oneline --graph --decorate
