/* ==========================================================================
   SETTINGS & SYSTEM LOGS MODULE
   DB Monitor, System Logs, User Management, Seeding Trigger
   ========================================================================== */

const SettingsModule = {
  async load() {
    this.bindEvents();
    await Promise.all([
      this.fetchProfile(),
      this.fetchStatus(),
      this.fetchLogs(),
      this.fetchUsers()
    ]);
  },

  bindEvents() {
    const btnReseed = document.getElementById('btn-reseed-db');
    if (btnReseed && !btnReseed.dataset.bound) {
      btnReseed.dataset.bound = 'true';
      btnReseed.addEventListener('click', () => this.handleReseed());
    }

    const logFilter = document.getElementById('log-severity-filter');
    if (logFilter && !logFilter.dataset.bound) {
      logFilter.dataset.bound = 'true';
      logFilter.addEventListener('change', () => this.fetchLogs());
    }
  },

  selectAvatar(url) {
    const inputUrl = document.getElementById('settings-profile-avatar-url');
    const imgPreview = document.getElementById('settings-avatar-preview');
    if (inputUrl) inputUrl.value = url;
    if (imgPreview) imgPreview.src = url;
  },

  async fetchProfile() {
    try {
      const user = Auth.getUser();
      if (!user) return;

      const inputName = document.getElementById('settings-profile-name');
      const inputCargo = document.getElementById('settings-profile-cargo');
      const inputUrl = document.getElementById('settings-profile-avatar-url');
      const imgPreview = document.getElementById('settings-avatar-preview');

      if (inputName) inputName.value = user.nome || '';
      if (inputCargo) inputCargo.value = user.cargo || user.role || 'Gestor de BI';
      if (inputUrl) inputUrl.value = user.avatar || '';
      if (imgPreview && user.avatar) imgPreview.src = user.avatar;
    } catch (err) {
      console.error('[PROFILE FETCH ERROR]', err);
    }
  },

  async saveProfile() {
    try {
      const name = document.getElementById('settings-profile-name')?.value;
      const cargo = document.getElementById('settings-profile-cargo')?.value;
      const avatar = document.getElementById('settings-profile-avatar-url')?.value;

      if (!name) {
        showToast('Por favor, informe seu nome.', 'warning');
        return;
      }

      showToast('Salvando foto e informações de perfil...', 'info');
      const res = await API.post('/api/auth/profile', { nome: name, cargo: cargo, avatar: avatar });
      if (res.success && res.user) {
        Auth.setUser(res.user);
        Auth.renderUserProfile();
        await this.fetchUsers();
        showToast('Perfil e foto de avatar atualizados com sucesso!', 'success');
      }
    } catch (err) {
      showToast(err.message || 'Falha ao salvar foto de perfil.', 'error');
    }
  },

  async fetchStatus() {
    try {
      const res = await API.get('/api/admin/status');
      const st = res.status;

      const elDriver = document.getElementById('db-status-driver');
      const elHost = document.getElementById('db-status-host');
      const elDatabase = document.getElementById('db-status-name');
      const elLatency = document.getElementById('db-status-latency');
      const elRecords = document.getElementById('db-status-records');
      const elConnected = document.getElementById('db-status-connected');

      if (elDriver) elDriver.textContent = st.driver.toUpperCase();
      if (elHost) elHost.textContent = `${st.host}:${st.port}`;
      if (elDatabase) elDatabase.textContent = st.database;
      if (elLatency) elLatency.textContent = `${st.latency_ms} ms`;
      if (elRecords) elRecords.textContent = `${st.total_atendimentos} atendimentos`;
      
      if (elConnected) {
        if (st.connected) {
          elConnected.innerHTML = `<span class="badge badge-success">Conectado & Operacional</span>`;
        } else {
          elConnected.innerHTML = `<span class="badge badge-danger">Desconectado (${st.last_error || 'Erro'})</span>`;
        }
      }

      // Atualizar badge do rodapé da sidebar
      const sidebarPill = document.getElementById('sidebar-db-status');
      if (sidebarPill) {
        sidebarPill.innerHTML = `
          <div class="status-dot ${st.connected ? '' : 'danger'}"></div>
          <span style="font-weight: 600; color: #fff;">${st.driver === 'mysql' ? 'MySQL 8.0' : 'SQLite Local'}</span>
          <span style="color: #94a3b8; font-size: 0.7rem;">(${st.latency_ms}ms)</span>
        `;
      }

    } catch (err) {
      console.error('[STATUS ERROR]', err);
    }
  },

  async fetchLogs() {
    try {
      const filter = document.getElementById('log-severity-filter')?.value || 'all';
      const res = await API.get('/api/admin/logs', { nivel: filter, limit: 40 });
      const tbody = document.getElementById('settings-logs-table-body');
      if (!tbody) return;

      if (!res.logs || res.logs.length === 0) {
        tbody.innerHTML = `<tr><td colspan="5" style="text-align:center; padding: 2rem;">Nenhum registro de log encontrado.</td></tr>`;
        return;
      }

      tbody.innerHTML = res.logs.map((log) => {
        let badgeClass = 'badge-info';
        if (log.nivel === 'WARN') badgeClass = 'badge-warning';
        if (log.nivel === 'ERROR') badgeClass = 'badge-danger';
        if (log.nivel === 'SUCCESS') badgeClass = 'badge-success';

        return `
          <tr>
            <td><span class="badge ${badgeClass}">${log.nivel}</span></td>
            <td><span class="font-mono font-semibold" style="color: var(--primary);">${log.modulo}</span></td>
            <td style="font-size: 0.8rem;">${log.mensagem}</td>
            <td style="font-size: 0.72rem; color: var(--text-dim);">${log.criado_em}</td>
          </tr>
        `;
      }).join('');

    } catch (err) {
      console.error('[LOGS ERROR]', err);
    }
  },

  cachedUsers: [],

  async fetchUsers() {
    try {
      const res = await API.get('/api/auth/users');
      this.cachedUsers = res.users || [];
      const tbody = document.getElementById('settings-users-table-body');
      if (!tbody) return;

      if (!res.users || res.users.length === 0) {
        tbody.innerHTML = `<tr><td colspan="5" style="text-align:center; padding: 1.5rem;">Nenhum usuário cadastrado.</td></tr>`;
        return;
      }

      tbody.innerHTML = res.users.map((u) => {
        const isCurrent = Auth.getUser() && Auth.getUser().id === u.id;
        const deleteBtn = isCurrent
          ? `<span style="font-size: 0.72rem; color: var(--text-dim);">(Você)</span>`
          : `<button class="btn btn-outline btn-sm" onclick="SettingsModule.deleteUser(${u.id}, '${u.nome.replace(/'/g, "\\'")}')" style="color: var(--danger); border-color: rgba(239,68,68,0.3); padding: 0.2rem 0.5rem; font-size: 0.75rem;">Excluir</button>`;

        return `
          <tr>
            <td>
              <div style="display: flex; align-items: center; gap: 0.65rem;">
                <img src="${u.avatar || 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=150'}" style="width: 32px; height: 32px; border-radius: 50%; object-fit: cover; border: 1.5px solid var(--primary);" />
                <span class="font-semibold" style="color: var(--text-main);">${u.nome}</span>
              </div>
            </td>
            <td><span style="font-size: 0.82rem;">${u.email}</span></td>
            <td><span class="badge badge-purple">${u.cargo || u.role}</span></td>
            <td><span class="badge badge-success">Ativo</span></td>
            <td style="text-align: right;">
              <div style="display: flex; justify-content: flex-end; gap: 0.4rem; align-items: center;">
                <button class="btn btn-secondary btn-sm" onclick="SettingsModule.openEditUserModal(${u.id})" style="padding: 0.2rem 0.55rem; font-size: 0.75rem;">
                  Editar / Avatar
                </button>
                ${deleteBtn}
              </div>
            </td>
          </tr>
        `;
      }).join('');

    } catch (err) {
      console.error('[USERS ERROR]', err);
    }
  },

  openCreateUserModal() {
    const modal = document.getElementById('modal-user-manage');
    if (!modal) return;

    document.getElementById('modal-user-title').textContent = 'Cadastrar Novo Usuário';
    document.getElementById('user-manage-id').value = '';
    document.getElementById('user-manage-nome').value = '';
    document.getElementById('user-manage-email').value = '';
    document.getElementById('user-manage-password').value = '';
    document.getElementById('user-manage-password').required = true;
    document.getElementById('user-manage-cargo').value = 'Consultor CRM';
    document.getElementById('user-manage-role').value = 'analista';
    document.getElementById('user-manage-avatar').value = 'https://i.ibb.co/wNFwnKqT/Screenshot-3.png';
    document.getElementById('user-manage-avatar-preview').src = 'https://i.ibb.co/wNFwnKqT/Screenshot-3.png';

    modal.classList.remove('hidden');
  },

  openEditUserModal(userId) {
    const u = this.cachedUsers.find((user) => user.id === userId);
    if (!u) return;

    const modal = document.getElementById('modal-user-manage');
    if (!modal) return;

    document.getElementById('modal-user-title').textContent = `Editar Usuário: ${u.nome}`;
    document.getElementById('user-manage-id').value = u.id;
    document.getElementById('user-manage-nome').value = u.nome || '';
    document.getElementById('user-manage-email').value = u.email || '';
    document.getElementById('user-manage-password').value = '';
    document.getElementById('user-manage-password').required = false;
    document.getElementById('user-manage-cargo').value = u.cargo || u.role || 'Consultor CRM';
    document.getElementById('user-manage-role').value = u.role || 'analista';
    const av = u.avatar || 'https://i.ibb.co/wNFwnKqT/Screenshot-3.png';
    document.getElementById('user-manage-avatar').value = av;
    document.getElementById('user-manage-avatar-preview').src = av;

    modal.classList.remove('hidden');
  },

  closeUserModal() {
    const modal = document.getElementById('modal-user-manage');
    if (modal) modal.classList.add('hidden');
  },

  async saveUserSubmit(e) {
    e.preventDefault();
    try {
      const userId = document.getElementById('user-manage-id').value;
      const nome = document.getElementById('user-manage-nome').value;
      const email = document.getElementById('user-manage-email').value;
      const password = document.getElementById('user-manage-password').value;
      const cargo = document.getElementById('user-manage-cargo').value;
      const role = document.getElementById('user-manage-role').value;
      const avatar = document.getElementById('user-manage-avatar').value;

      showToast('Processando informações do usuário...', 'info');

      let res;
      if (userId) {
        // Modo Edição (PUT)
        res = await API.put(`/api/auth/users/${userId}`, { nome, email, password, cargo, role, avatar });
      } else {
        // Modo Cadastro (POST)
        res = await API.post('/api/auth/users', { nome, email, password, cargo, role, avatar });
      }

      if (res.success) {
        showToast(res.message || 'Usuário salvo com sucesso!', 'success');
        this.closeUserModal();
        await this.fetchUsers();
        if (Auth.getUser() && String(Auth.getUser().id) === String(userId)) {
          Auth.setUser(res.user || { ...Auth.getUser(), nome, avatar, cargo, role });
          Auth.renderUserProfile();
        }
      }
    } catch (err) {
      showToast(err.message || 'Falha ao salvar usuário.', 'error');
    }
  },

  async deleteUser(userId, userName) {
    if (!confirm(`Tem certeza que deseja excluir o usuário "${userName}"? Essa ação não poderá ser desfeita.`)) {
      return;
    }

    try {
      showToast('Excluindo usuário...', 'info');
      const res = await API.delete(`/api/auth/users/${userId}`);
      if (res.success) {
        showToast(res.message || 'Usuário removido com sucesso.', 'success');
        await this.fetchUsers();
      }
    } catch (err) {
      showToast(err.message || 'Falha ao excluir usuário.', 'error');
    }
  },

  async handleReseed() {
    if (!confirm('Deseja recriar a massa de dados de teste com ~180 atendimentos realistas? Os dados atuais serão substituídos.')) {
      return;
    }

    try {
      showToast('Recriando massa de dados...', 'info');
      const res = await API.post('/api/admin/reseed');
      if (res.success) {
        showToast(res.message, 'success');
        await this.fetchStatus();
        await this.fetchLogs();
      }
    } catch (err) {
      showToast(err.message || 'Erro ao recriar dados.', 'error');
    }
  }
};
