<?php
/**
 * ASISMA CRM - Contactos Controller
 */
class ContactosController extends Controller {

    public function index() {
        $db = Database::getInstance();
        $where = "c.activo = 1";
        $params = array();

        if (!SessionHelper::isAdmin()) {
            $franquiciadoId = SessionHelper::getFranquiciadoId();
            $where .= " AND c.id IN (SELECT DISTINCT l.contacto_id FROM leads l WHERE l.franquiciado_id = :fid)";
            $params['fid'] = $franquiciadoId;
        }

        $sql = "SELECT c.*, e.razon_social as empresa_nombre, e.rut as empresa_rut
                FROM contactos c
                LEFT JOIN empresas e ON c.empresa_id = e.id
                WHERE {$where}
                ORDER BY c.nombre ASC";

        $contactos = $db->fetchAll($sql, $params);
        $empresas  = $db->fetchAll("SELECT id, razon_social, rut FROM empresas WHERE activa = 1 ORDER BY razon_social ASC");

        $this->render('contactos/index', array(
            'title'     => 'Directorio de Contactos',
            'contactos' => $contactos,
            'empresas'  => $empresas
        ));
    }

    /**
     * Crear contacto (AJAX POST)
     */
    public function crear() {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            $this->json(array('success' => false, 'message' => 'Método no soportado.'), 405);
        }

        $nombre    = trim($this->input('nombre', ''));
        $telefono  = trim($this->input('telefono', ''));
        $email     = trim($this->input('email', ''));
        $cargo     = trim($this->input('cargo', ''));
        $empresaId = (int)$this->input('empresa_id');

        if (empty($nombre) || empty($telefono)) {
            $this->json(array('success' => false, 'message' => 'Nombre y teléfono son obligatorios.'));
        }

        $db = Database::getInstance();

        $datos = array(
            'nombre'     => $nombre,
            'telefono'   => normalizar_telefono($telefono),
            'correo'     => $email ? $email : null,
            'cargo'      => $cargo ? $cargo : null,
            'empresa_id' => $empresaId > 0 ? $empresaId : null,
            'activo'     => 1
        );

        $id = $db->insert('contactos', $datos);
        AuditHelper::log('create_contacto', 'contactos', $id, null, array('nombre' => $nombre));
        $this->json(array('success' => true, 'message' => 'Contacto creado correctamente.', 'id' => $id));
    }

    /**
     * Editar contacto (AJAX POST)
     */
    public function editar() {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            $this->json(array('success' => false, 'message' => 'Método no soportado.'), 405);
        }

        $id        = (int)$this->input('id');
        $nombre    = trim($this->input('nombre', ''));
        $telefono  = trim($this->input('telefono', ''));
        $email     = trim($this->input('email', ''));
        $cargo     = trim($this->input('cargo', ''));
        $empresaId = (int)$this->input('empresa_id');

        if ($id <= 0 || empty($nombre) || empty($telefono)) {
            $this->json(array('success' => false, 'message' => 'ID, nombre y teléfono son obligatorios.'));
        }

        $db = Database::getInstance();
        $contacto = $db->fetchOne("SELECT id FROM contactos WHERE id = :id", array('id' => $id));
        if (!$contacto) {
            $this->json(array('success' => false, 'message' => 'Contacto no encontrado.'));
        }

        $datos = array(
            'nombre'     => $nombre,
            'telefono'   => normalizar_telefono($telefono),
            'correo'     => $email ? $email : null,
            'cargo'      => $cargo ? $cargo : null,
            'empresa_id' => $empresaId > 0 ? $empresaId : null
        );

        $db->update('contactos', $datos, "id = :id", array('id' => $id));
        AuditHelper::log('edit_contacto', 'contactos', $id, null, array('nombre' => $nombre));
        $this->json(array('success' => true, 'message' => 'Contacto actualizado correctamente.'));
    }

    /**
     * Toggle activo/inactivo (AJAX POST)
     */
    public function toggleActivo() {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            $this->json(array('success' => false, 'message' => 'Método no soportado.'), 405);
        }

        $id = (int)$this->input('id');
        if ($id <= 0) {
            $this->json(array('success' => false, 'message' => 'ID inválido.'));
        }

        $db       = Database::getInstance();
        $contacto = $db->fetchOne("SELECT id, activo FROM contactos WHERE id = :id", array('id' => $id));
        if (!$contacto) {
            $this->json(array('success' => false, 'message' => 'Contacto no encontrado.'));
        }

        $nuevo = $contacto['activo'] ? 0 : 1;
        $db->update('contactos', array('activo' => $nuevo), "id = :id", array('id' => $id));
        AuditHelper::log('toggle_contacto', 'contactos', $id, array('activo' => $contacto['activo']), array('activo' => $nuevo));
        $this->json(array('success' => true, 'activo' => $nuevo, 'message' => $nuevo ? 'Contacto activado.' : 'Contacto desactivado.'));
    }

    /**
     * Obtener datos para edición (AJAX GET)
     */
    public function getData() {
        $id = (int)$this->input('id');
        if ($id <= 0) {
            $this->json(array('success' => false, 'message' => 'ID inválido.'));
        }

        $db   = Database::getInstance();
        $data = $db->fetchOne("SELECT * FROM contactos WHERE id = :id", array('id' => $id));
        if (!$data) {
            $this->json(array('success' => false, 'message' => 'No encontrado.'));
        }

        $this->json(array('success' => true, 'data' => $data));
    }
}
