#!/bin/bash
# ============================================================
#  SiGeM — Script de Instalação no Servidor
#  Município de Moatize — Ubuntu 22.04 LTS
#  Uso: sudo bash instalar.sh
# ============================================================

set -e
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
info()    { echo -e "${GREEN}[INFO]${NC} $1"; }
warning() { echo -e "${YELLOW}[AVISO]${NC} $1"; }
error()   { echo -e "${RED}[ERRO]${NC} $1"; exit 1; }

[ "$(id -u)" != "0" ] && error "Execute como root: sudo bash instalar.sh"

info "================================================================"
info " SiGeM — Sistema de Gestão Municipal de Moatize"
info " Instalação automática — Ubuntu 22.04"
info "================================================================"

# ── Verificar sistema ─────────────────────────────────────
OS=$(lsb_release -si 2>/dev/null || echo "Unknown")
[ "$OS" != "Ubuntu" ] && warning "Sistema não testado: $OS"

# ── Actualizar sistema ────────────────────────────────────
info "Actualizando sistema..."
apt-get update -qq && apt-get upgrade -y -qq

# ── Instalar dependências ──────────────────────────────────
info "Instalando dependências..."
apt-get install -y -qq \
  curl wget git unzip \
  ca-certificates gnupg \
  ufw fail2ban \
  net-tools htop

# ── Docker ────────────────────────────────────────────────
if ! command -v docker &>/dev/null; then
  info "Instalando Docker..."
  curl -fsSL https://get.docker.com | bash
  usermod -aG docker $SUDO_USER 2>/dev/null || true
  systemctl enable docker && systemctl start docker
  info "Docker instalado: $(docker --version)"
else
  info "Docker já instalado: $(docker --version)"
fi

# ── Docker Compose ─────────────────────────────────────────
if ! command -v docker compose &>/dev/null; then
  info "Instalando Docker Compose plugin..."
  apt-get install -y -qq docker-compose-plugin
fi
info "Docker Compose: $(docker compose version)"

# ── Criar directórios ──────────────────────────────────────
info "Criando estrutura de directórios..."
mkdir -p /opt/sigem/{uploads,logs,backups,ssl,nginx}
chown -R 1001:1001 /opt/sigem/uploads /opt/sigem/logs
chmod 700 /opt/sigem/backups

# ── Copiar ficheiros do sistema ────────────────────────────
info "Copiando ficheiros do SiGeM..."
cp -r . /opt/sigem/
cd /opt/sigem

# ── Configurar variáveis de ambiente ──────────────────────
if [ ! -f .env ]; then
  info "Criando ficheiro .env..."
  cp backend/.env.example .env

  # Gerar senhas aleatórias
  DB_PASS=$(openssl rand -base64 32 | tr -d '/+=' | head -c 32)
  JWT_KEY=$(openssl rand -base64 64 | tr -d '/+=' | head -c 64)
  REDIS_PASS=$(openssl rand -base64 16 | tr -d '/+=' | head -c 16)

  sed -i "s/ALTERAR_SENHA_FORTE_AQUI/$DB_PASS/" .env
  sed -i "s/ALTERAR_CHAVE_JWT_256BITS_AQUI/$JWT_KEY/" .env
  echo "DB_PASSWORD=$DB_PASS"     >> .env
  echo "JWT_SECRET=$JWT_KEY"      >> .env
  echo "REDIS_PASSWORD=$REDIS_PASS" >> .env
  echo "VITE_API_URL=https://sigem.isc-hefsiba.ac.mz/api/v1" >> .env

  warning "IMPORTANTE: Configure o email SMTP em /opt/sigem/.env"
  warning "           Ficheiro .env criado com senhas geradas automaticamente"
fi

# ── Firewall ───────────────────────────────────────────────
info "Configurando firewall UFW..."
ufw --force reset
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable
info "Firewall configurado."

# ── Fail2ban ──────────────────────────────────────────────
info "Configurando Fail2ban..."
cat > /etc/fail2ban/jail.local << 'F2B'
[DEFAULT]
bantime  = 3600
findtime = 600
maxretry = 5

[sshd]
enabled = true
port    = ssh
logpath = /var/log/auth.log

[nginx-http-auth]
enabled = true
F2B
systemctl enable fail2ban && systemctl restart fail2ban

# ── SSL (auto-assinado para desenvolvimento) ──────────────
if [ ! -f /opt/sigem/ssl/fullchain.pem ]; then
  info "Gerando certificado SSL auto-assinado (para desenvolvimento)..."
  warning "Em produção real, use Let's Encrypt: certbot --nginx -d sigem.isc-hefsiba.ac.mz"
  openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /opt/sigem/ssl/privkey.pem \
    -out /opt/sigem/ssl/fullchain.pem \
    -subj "/C=MZ/ST=Tete/L=Moatize/O=Municipio de Moatize/CN=sigem.isc-hefsiba.ac.mz" \
    -quiet
fi

# ── Build e iniciar ────────────────────────────────────────
info "Construindo imagens Docker..."
cd /opt/sigem
docker compose build --no-cache

info "Iniciando SiGeM..."
docker compose up -d

# Aguardar que os serviços fiquem prontos
info "Aguardando serviços ficarem prontos..."
sleep 15

# Verificar saúde
if curl -sf http://localhost:3000/health > /dev/null; then
  info "Backend OK: http://localhost:3000"
else
  warning "Backend pode ainda estar a iniciar. Verifique: docker compose logs backend"
fi

# ── Serviço systemd para auto-restart ─────────────────────
cat > /etc/systemd/system/sigem.service << 'SERVICE'
[Unit]
Description=SiGeM — Sistema de Gestão Municipal de Moatize
Requires=docker.service
After=docker.service network-online.target

[Service]
Type=forking
WorkingDirectory=/opt/sigem
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
RemainAfterExit=yes
Restart=on-failure
RestartSec=30s

[Install]
WantedBy=multi-user.target
SERVICE

systemctl daemon-reload
systemctl enable sigem
info "Serviço systemd registado. O SiGeM iniciará automaticamente com o servidor."

# ── Resumo final ──────────────────────────────────────────
echo ""
echo -e "${GREEN}================================================================${NC}"
echo -e "${GREEN} SiGeM instalado com sucesso!${NC}"
echo -e "${GREEN}================================================================${NC}"
echo ""
echo "  Portal:          https://sigem.isc-hefsiba.ac.mz"
echo "  API:             http://localhost:3000/api/v1"
echo "  Health:          http://localhost:3000/health"
echo ""
echo "  Logs:            docker compose logs -f"
echo "  Parar:           docker compose down"
echo "  Reiniciar:       docker compose restart"
echo "  Base de dados:   docker compose exec postgres psql -U sigem_user sigem_moatize"
echo ""
echo "  Credenciais em:  /opt/sigem/.env"
echo ""
warning "PRÓXIMOS PASSOS:"
echo "  1. Configure o SMTP em /opt/sigem/.env"
echo "  2. Configure o DNS: sigem.isc-hefsiba.ac.mz → IP deste servidor"
echo "  3. Instale certificado SSL real: certbot --nginx -d sigem.isc-hefsiba.ac.mz"
echo "  4. Altere as senhas iniciais dos utilizadores"
echo ""
