<?php

namespace dokuwiki\plugin\bez\mdl;

class LabelFactory extends Factory {

    /**
     * Verifica si ya existe un label con el nombre dado
     *
     * @param string $name Nombre a verificar
     * @param int|null $excludeId ID a excluir de la busqueda (para ediciones)
     * @return bool true si el nombre ya existe
     */
    public function nameExists($name, $excludeId = null) {
        $table = $this->get_table_name();

        if ($excludeId !== null) {
            $q = "SELECT COUNT(*) FROM $table WHERE name = ? AND id != ?";
            $sth = $this->model->db->prepare($q);
            $sth->execute(array($name, $excludeId));
        } else {
            $q = "SELECT COUNT(*) FROM $table WHERE name = ?";
            $sth = $this->model->db->prepare($q);
            $sth->execute(array($name));
        }

        $count = $sth->fetchColumn();
        $sth->closeCursor();

        return $count > 0;
    }

    /**
     * Sobrescribe initial_save para validar nombre duplicado
     */
    public function initial_save(Entity $obj, $data) {
        // Validar nombre duplicado antes de guardar
        if (isset($data['name']) && $this->nameExists($data['name'])) {
            throw new \Exception('duplicate_name');
        }

        parent::initial_save($obj, $data);
    }

    /**
     * Sobrescribe update_save para validar nombre duplicado
     */
    public function update_save(Entity $obj, $data) {
        // Validar nombre duplicado antes de actualizar (excluyendo el registro actual)
        if (isset($data['name']) && $this->nameExists($data['name'], $obj->id)) {
            throw new \Exception('duplicate_name');
        }

        parent::update_save($obj, $data);
    }

    /**
     * Sobrescribe save para validar nombre duplicado
     */
    public function save(Entity $obj) {
        // Validar nombre duplicado antes de guardar
        if ($obj->id == NULL) {
            // Insercion: verificar si el nombre ya existe
            if ($this->nameExists($obj->name)) {
                throw new \Exception('duplicate_name');
            }
        } else {
            // Actualizacion: verificar excluyendo el registro actual
            if ($this->nameExists($obj->name, $obj->id)) {
                throw new \Exception('duplicate_name');
            }
        }

        parent::save($obj);
    }
}