#!/usr/bin/env bash
#
# reset-framework.sh — restaura o framework ao estado atual do GitHub
#
# Uso:
#   ./reset-framework.sh            # volta a main (estado limpo do GitHub)
#   ./reset-framework.sh --prs      # volta a main e reaplica os 2 PRs em teste
#
# A pasta web/mad-framework e descartavel: este script joga fora QUALQUER
# alteracao local e recoloca o repositorio no estado de origin/main.
set -euo pipefail

REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/mad-framework"
INTEGRATION_BRANCH="testes/pr3-pr4-aplicados"
PR_BRANCHES=(
  "origin/feature/theme-notch-sidebar-toggle"
  "origin/fix/toggle-menu-builder-template"
)

apply_slim_context() {
  echo "==> Enxugando contexto Claude (.claude/rules -> docs/mad-rules)..."

  mkdir -p docs/mad-rules

  if [[ -d .claude/rules ]]; then
    find .claude/rules -maxdepth 1 -type f -name '*.md' -exec mv -f {} docs/mad-rules/ \;

    if [[ -d .claude/rules/_backup ]]; then
      rm -rf docs/mad-rules/_backup
      mv .claude/rules/_backup docs/mad-rules/_backup
    fi

    rm -rf .claude/rules
  fi

  (
    cd docs/mad-rules
    {
      echo "# Índice — Regras (carregar sob demanda)"
      echo
      echo "NÃO auto-carregados. Leia via Read quando relevante."
      echo

      for f in *.md; do
        [[ "$f" == "INDEX.md" || ! -f "$f" ]] && continue
        d=$(grep -m1 '^#' "$f" | sed 's/^#* *//')
        echo "- \`$f\` — $d"
      done

      if [[ -d _backup ]]; then
        echo
        echo "## _backup/ — por componente"
        find _backup -maxdepth 1 -type f -name '*.md' -printf '%f\n' | sort | sed 's/^/- `/' | sed 's/$/`/'
      fi
    } > INDEX.md
  )

  python3 - <<'PY'
from pathlib import Path

p = Path('CLAUDE.md')
s = p.read_text() if p.exists() else '# CLAUDE.md\n\n'
section = '''
## Regras MAD sob demanda

As regras volumosas foram removidas do auto-load de `.claude/rules/` e ficam em `docs/mad-rules/`. Não cole o conteúdo dessas regras aqui; leia apenas quando o trabalho exigir. O índice completo está em `docs/mad-rules/INDEX.md`.

| Vou trabalhar com | Leia sob demanda |
|---|---|
| Formulários, layout de formulário, detalhes ou listas | `docs/mad-rules/form-rules.md`, `docs/mad-rules/form-layout-rules.md`, `docs/mad-rules/detail-form-rules.md`, `docs/mad-rules/list-rules.md` |
| Blade, atributos, variáveis de view ou componentes MAD | `docs/mad-rules/blade-rules.md`, `docs/mad-rules/blade-attribute-quotes-rules.md`, `docs/mad-rules/madcomponent-view-vars-rules.md`, `docs/mad-rules/mad-componentes-admin-map.md` |
| Banco, consultas, filtros ou requisições | `docs/mad-rules/database-query-rules.md`, `docs/mad-rules/tcriteria-tfilter-rules.md`, `docs/mad-rules/madrequest-rules.md` |
| Rotas públicas ou páginas públicas/site | `docs/mad-rules/public-routes-rules.md`, `docs/mad-rules/mad-componentes-site-map.md`, `docs/mad-rules/mad-site-overview-rules.md` |
| Componentes específicos de UI | `docs/mad-rules/_backup/<componente>-rules.md` e `docs/mad-rules/INDEX.md` |

'''
if '## Regras MAD sob demanda' not in s:
    marker = '## Project Overview\n'
    s = s.replace(marker, section + marker) if marker in s else s.rstrip() + '\n\n' + section
p.write_text(s)
PY
}

cd "$REPO_DIR"

echo "==> Buscando atualizacoes do GitHub..."
git fetch origin --prune

echo "==> Descartando alteracoes locais e voltando para main..."
git checkout -f main
git reset --hard origin/main
# preserva vendor/ (composer caro) e tmp/ (cache) — limpa o resto
git clean -fd -e vendor -e tmp

if [[ "${1:-}" == "--prs" ]]; then
  echo "==> Recriando branch de integracao com os 2 PRs..."
  git branch -D "$INTEGRATION_BRANCH" 2>/dev/null || true
  git checkout -b "$INTEGRATION_BRANCH"
  for b in "${PR_BRANCHES[@]}"; do
    echo "    -> aplicando $b"
    git merge --no-ff -X theirs "$b" -m "Aplica PR: ${b#origin/}"
  done
  echo "==> Pronto. Branch '$INTEGRATION_BRANCH' com os 2 PRs aplicados."
else
  echo "==> Pronto. Repositorio no estado limpo de origin/main."
fi

apply_slim_context

echo "==> Corrigindo configs de banco SQLite..."
# Os configs no git têm nomes errados/legados — corrigir após cada reset
sed -i "s/'name' => \".*\",/'name' => \"app\/database\/permission.db\",/" app/config/permission.php
sed -i "s/'name' => \".*\",/'name' => \"app\/database\/log.db\",/"        app/config/log.php
sed -i "s/'name' => \".*\",/'name' => \"app\/database\/communication.db\",/" app/config/communication.php
sed -i "s/'name' => \".*\",/'name' => \"app\/database\/minierp.db\",/"    app/config/minierp.php

echo "==> Garantindo dependencias e permissoes..."
[ -d vendor ] || composer install --no-interaction --no-progress
mkdir -p tmp/blade-cache app/output

echo "==> Recriando bancos SQLite a partir dos SQLs do repositorio..."

DB_DIR="app/database"

recreate_db() {
  local db="$DB_DIR/$1.db"
  local schema="$DB_DIR/$2"
  local inserts="${3:-}"
  rm -f "$db"
  sqlite3 "$db" < "$schema"
  [[ -n "$inserts" && -f "$DB_DIR/$inserts" ]] && sqlite3 "$db" < "$DB_DIR/$inserts"
  echo "    -> $db OK"
}

recreate_db "permission"    "permission-sqlite.sql"    "inserts-permission.sql"
recreate_db "log"           "log-sqlite.sql"
recreate_db "communication" "communication-sqlite.sql"
recreate_db "minierp"       "minierp-sqlite.sql"       "minierp-inserts.sql"

# Migracoes: tabelas/colunas que o codigo espera mas os SQLs do git ainda nao tem
# (permission) importador de dados
sqlite3 "$DB_DIR/permission.db" "
CREATE TABLE IF NOT EXISTS system_import_template (
    id INTEGER PRIMARY KEY NOT NULL,
    title TEXT,
    code TEXT,
    description TEXT,
    database_name TEXT,
    mapping_json TEXT,
    csv_model_path TEXT,
    import_mode TEXT,
    active char(1) DEFAULT 'Y',
    created_by INT,
    created_at TEXT,
    updated_at TEXT
);
CREATE TABLE IF NOT EXISTS system_import_template_group (
    id INTEGER PRIMARY KEY NOT NULL,
    template_id INT,
    system_group_id INT
);
CREATE TABLE IF NOT EXISTS system_import_template_user (
    id INTEGER PRIMARY KEY NOT NULL,
    template_id INT,
    system_user_id INT
);
CREATE TABLE IF NOT EXISTS system_import_log (
    id INTEGER PRIMARY KEY NOT NULL,
    template_id INT,
    database_name TEXT,
    mapping_json TEXT,
    file_name TEXT,
    import_mode TEXT,
    total_rows INT,
    success_rows INT,
    error_rows INT,
    errors_json TEXT,
    system_user_id INT,
    created_at TEXT
);
"
echo "    -> migracao permission.db (importador) OK"

# (communication) system_message — colunas adicionadas pelo PR de mensagens
sqlite3 "$DB_DIR/communication.db" "
ALTER TABLE system_message ADD COLUMN thread_id INT;
ALTER TABLE system_message ADD COLUMN reply_to_id INT;
ALTER TABLE system_message ADD COLUMN deleted_by_from char(1) DEFAULT 'N';
ALTER TABLE system_message ADD COLUMN deleted_by_to char(1) DEFAULT 'N';
CREATE TABLE IF NOT EXISTS system_message_attachment (
    id INTEGER PRIMARY KEY NOT NULL,
    system_message_id INT,
    file_path TEXT,
    file_name TEXT,
    file_size INT
);
" 2>/dev/null || true
echo "    -> migracao communication.db OK"

# Atualizar senhas para bcrypt (inserts usam MD5 legado que o sistema rejeita)
BCRYPT_ADMIN=$(php -r "echo password_hash('admin', PASSWORD_BCRYPT);")
BCRYPT_USER=$(php -r "echo password_hash('user', PASSWORD_BCRYPT);")
sqlite3 "$DB_DIR/permission.db" "UPDATE system_users SET password = '$BCRYPT_ADMIN' WHERE login = 'admin';"
sqlite3 "$DB_DIR/permission.db" "UPDATE system_users SET password = '$BCRYPT_USER'  WHERE login = 'user';"
echo "    -> senhas admin/user atualizadas para bcrypt"

# Criar unidade padrão e vincular ao admin (inserts-permission.sql não inclui system_unit)
sqlite3 "$DB_DIR/permission.db" "
INSERT OR IGNORE INTO system_unit (id, name, connection_name) VALUES (1, 'Matriz', 'minierp');
INSERT OR IGNORE INTO system_user_unit (id, system_user_id, system_unit_id) VALUES (1, 1, 1);
"
echo "    -> unidade 'Matriz' criada e vinculada ao admin"

# Apache (www-data) precisa escrever em cache, output e nos bancos SQLite
chown -R www-data:www-data tmp app/output app/database 2>/dev/null || true
chmod -R 775 tmp app/output app/database 2>/dev/null || true

git log --oneline -1
