<?php

/**
 * Modelo para la tabla "sidcai_historia_historial".
 *
 * Campos:
 * @property integer $historia_id
 * @property integer $apor_codigo_fk
 * @property string $codigo
 * @property string $observaciones
 * @property string $archivo
 * @property integer $estatus_codigo_fk
 * @property string $fecha_creacion
 * @property integer $usuario_id_fk
 *
 * Relaciones:
 * @property SidcaiAportante $aportante
 * @property SidcaiEstatus $estatus
 * @property Usuarios $usuario
 */
class SidcaiHistoriaHistorial extends CActiveRecord
{
    public $archivo_subida; // Para manejar la subida del archivo desde formularios

    /**
     * Retorna el modelo estático de la clase.
     * @param string $className nombre de la clase activa.
     * @return SidcaiHistoriaHistorial el modelo estático
     */
    public static function model($className = __CLASS__)
    {
        return parent::model($className);
    }

    /**
     * Nombre de la tabla en la base de datos.
     */
    public function tableName()
    {
        return 'sidcai_historia_historial';
    }

    /**
     * Reglas de validación.
     */
    public function rules()
    {
        return array(
            array('apor_codigo_fk, codigo, observaciones, estatus_codigo_fk', 'required'),
            array('apor_codigo_fk, estatus_codigo_fk, usuario_id_fk', 'numerical', 'integerOnly' => true),
            array('codigo', 'length', 'max' => 50),
            array('archivo', 'length', 'max' => 255),
            
            // Manejo de archivo (opcional)
            array('archivo_subida', 'file', 
                'types' => 'pdf, jpg, jpeg, png, doc, docx', 
                'allowEmpty' => true,
                'maxSize' => 5 * 1024 * 1024, // 5 MB
                'tooLarge' => 'El archivo no puede superar los 5 MB.'
            ),

            // Safe para búsquedas
            array('historia_id, apor_codigo_fk, codigo, observaciones, archivo, estatus_codigo_fk, fecha_creacion, usuario_id_fk', 'safe', 'on' => 'search'),
        );
    }

    /**
     * Relaciones entre modelos.
     */
    public function relations()
    {
        return array(
            'aportante' => array(self::BELONGS_TO, 'SidcaiAportante', 'apor_codigo_fk'),
            'estatus' => array(self::BELONGS_TO, 'SidcaiEstatus', 'estatus_codigo_fk'),
            'usuario' => array(self::BELONGS_TO, 'Usuarios', 'usuario_id_fk'),
        );
    }

    /**
     * Etiquetas para los atributos (para formularios o vistas).
     */
    public function attributeLabels()
    {
        return array(
            'historia_id' => 'ID Historial',
            'apor_codigo_fk' => 'Aportante',
            'codigo' => 'Código',
            'observaciones' => 'Observaciones',
            'archivo' => 'Archivo',
            'archivo_subida' => 'Archivo a subir',
            'estatus_codigo_fk' => 'Estatus',
            'fecha_creacion' => 'Fecha de creación',
            'usuario_id_fk' => 'Usuario',
        );
    }

    /**
     * Antes de guardar, manejar la subida de archivo.
     */
    protected function beforeSave()
    {
        if (parent::beforeSave()) {
            // Manejo de archivo si se sube uno nuevo
            $this->archivo_subida = CUploadedFile::getInstance($this, 'archivo_subida');

            if ($this->archivo_subida !== null) {
                $nombreArchivo = uniqid('historial_') . '.' . $this->archivo_subida->extensionName;
                $ruta = Yii::getPathOfAlias('webroot.uploads.historial') . '/' . $nombreArchivo;

                // Crear carpeta si no existe
                if (!file_exists(dirname($ruta))) {
                    mkdir(dirname($ruta), 0775, true);
                }

                if ($this->archivo_subida->saveAs($ruta)) {
                    $this->archivo = 'uploads/historial/' . $nombreArchivo;
                }
            }

            // Si es un nuevo registro, guarda el usuario actual
            if ($this->isNewRecord && Yii::app()->user->id) {
                $this->usuario_id_fk = Yii::app()->user->id;
            }

            return true;
        }

        return false;
    }

    /**
     * Búsqueda (para admin o reportes).
     */
    public function search()
    {
        $criteria = new CDbCriteria;

        $criteria->compare('historia_id', $this->historia_id);
        $criteria->compare('apor_codigo_fk', $this->apor_codigo_fk);
        $criteria->compare('codigo', $this->codigo, true);
        $criteria->compare('observaciones', $this->observaciones, true);
        $criteria->compare('archivo', $this->archivo, true);
        $criteria->compare('estatus_codigo_fk', $this->estatus_codigo_fk);
        $criteria->compare('fecha_creacion', $this->fecha_creacion, true);
        $criteria->compare('usuario_id_fk', $this->usuario_id_fk);

        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
            'sort' => array('defaultOrder' => 'fecha_creacion DESC'),
        ));
    }
}
