<?php

namespace app\models;
use app\models\DocumentosPedido;

use Yii;
use yii\db\ActiveRecord;
use yii\behaviors\TimestampBehavior; // <-- Add this
use yii\db\Expression;

/**
 * This is the model class for table "productos".
 *
 * @property int $id
 * @property string $codigo_producto
 * @property string|null $codigo_proveedor
 * @property string|null $descripcion
 * @property string|null $marca
 * @property string|null $presentacion
 * @property float|null $peso_unitario
 * @property string|null $unidad_medida
 * @property int|null $unidades_caja
 * @property float|null $peso_caja_interna Weight Inner Box
 * @property int|null $unidades_carton
 * @property float|null $peso_carton Weight Carton
 * @property float|null $cbm
 * @property float|null $gw
 * @property string|null $medida_unidad Unidad para dimensiones (cm, in, etc.)
 * @property float|null $largo
 * @property float|null $ancho
 * @property float|null $alto
 * @property float|null $largo_caja_interna
 * @property float|null $ancho_caja_interna
 * @property float|null $alto_caja_interna
 * @property float|null $largo_carton_master Largo Cajón
 * @property float|null $ancho_carton_master Ancho Cajón
 * @property float|null $alto_carton_master Alto Cajón (Asumido)
 * @property string|null $ruta_imagen
 * @property string|null $status
 * @property string $fecha_creacion
 * @property string $fecha_actualizacion
 * @property string|null $tipo_documento_predeterminado Define si el producto pertenece a CLAC o TBS
 *
 * @property CotizacionItems[] $cotizacionItems
 * @property PedidoReportePrecios[] $pedidoReportePrecios
 */
class Productos extends \yii\db\ActiveRecord
{


    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'productos';
    }

    /**
     * {@inheritdoc}
     */


    public function behaviors() // <-- Add this whole method
    {
        return [
            [
                'class' => TimestampBehavior::class,
                'attributes' => [
                    ActiveRecord::EVENT_BEFORE_INSERT => ['fecha_creacion', 'fecha_actualizacion'],
                    ActiveRecord::EVENT_BEFORE_UPDATE => ['fecha_actualizacion'],
                ],
                // Use the database's own expression for NOW()
                'value' => new Expression('NOW()'),
            ],
        ];
    }

    /**
     * {@inheritdoc}
     */

    public function rules()
    {
        return [
            [['codigo_proveedor', 'descripcion', 'marca', 'presentacion', 'peso_unitario', 'unidad_medida', 'unidades_caja', 'peso_caja_interna', 'unidades_carton', 'peso_carton', 'cbm', 'gw', 'medida_unidad', 'largo', 'ancho', 'alto', 'largo_caja_interna', 'ancho_caja_interna', 'alto_caja_interna', 'largo_carton_master', 'ancho_carton_master', 'alto_carton_master', 'ruta_imagen', 'status', 'tipo_documento_predeterminado'], 'default', 'value' => null],
            [['codigo_producto'], 'required'],
            [['descripcion'], 'string'],
            [['peso_unitario', 'peso_caja_interna', 'peso_carton', 'cbm', 'gw', 'largo', 'ancho', 'alto', 'largo_caja_interna', 'ancho_caja_interna', 'alto_caja_interna', 'largo_carton_master', 'ancho_carton_master', 'alto_carton_master'], 'number'],
            [['unidades_caja', 'unidades_carton'], 'integer'],
            [['codigo_producto', 'codigo_proveedor', 'unidad_medida'], 'string', 'max' => 50],
            [['marca', 'presentacion'], 'string', 'max' => 100],
            [['medida_unidad', 'status'], 'string', 'max' => 20],
            [['ruta_imagen'], 'string', 'max' => 255],
            [['tipo_documento_asignado'], 'string', 'max' => 10],
            [['codigo_producto'], 'unique'],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'codigo_producto' => 'Codigo Producto',
            'codigo_proveedor' => 'Codigo Proveedor',
            'descripcion' => 'Descripcion',
            'marca' => 'Marca',
            'presentacion' => 'Presentacion',
            'peso_unitario' => 'Peso Unitario',
            'unidad_medida' => 'Unidad Medida',
            'unidades_caja' => 'Unidades Caja',
            'peso_caja_interna' => 'Peso Caja Interna',
            'unidades_carton' => 'Unidades Carton',
            'peso_carton' => 'Peso Carton',
            'cbm' => 'Cbm',
            'gw' => 'Gw',
            'medida_unidad' => 'Medida Unidad',
            'largo' => 'Largo',
            'ancho' => 'Ancho',
            'alto' => 'Alto',
            'largo_caja_interna' => 'Largo Caja Interna',
            'ancho_caja_interna' => 'Ancho Caja Interna',
            'alto_caja_interna' => 'Alto Caja Interna',
            'largo_carton_master' => 'Largo Carton Master',
            'ancho_carton_master' => 'Ancho Carton Master',
            'alto_carton_master' => 'Alto Carton Master',
            'ruta_imagen' => 'Ruta Imagen',
            'status' => 'Status',
            'fecha_creacion' => 'Fecha Creacion',
            'fecha_actualizacion' => 'Fecha Actualizacion',
            'tipo_documento_predeterminado' => 'Tipo Documento Predeterminado',
        ];
    }

    /**
     * Gets query for [[CotizacionItems]].
     *
     * @return \yii\db\ActiveQuery
     */
    public function getCotizacionItems()
    {
        return $this->hasMany(CotizacionItems::class, ['producto_id' => 'id']);
    }

    /**
     * Gets query for [[PedidoReportePrecios]].
     *
     * @return \yii\db\ActiveQuery
     */
    public function getPedidoReportePrecios()
    {
        return $this->hasMany(PedidoReportePrecios::class, ['producto_id' => 'id']);
    }


    public static function clasificarParaDocumento(Productos $producto)
    {
        $codigo = $producto->codigo_producto;
        
        // 1. Detección de New Code (basado en el patrón 'NEWCODE' + ID)
        // Esto es esencial para la lógica de agrupamiento de 20 en 20 de la CLAC.
        $esNewCode = strpos($codigo, 'NEWCODE') === 0;

        // 2. Determina el tipo de documento asignado (Leemos el valor que guardamos en actionCreate)
        $tipo = strtoupper($producto->tipo_documento_asignado);
        
        // Si el valor guardado es inválido o nulo, asumimos 'CLAC' (por seguridad)
        if (!in_array($tipo, ['CLAC', 'TBS'])) {
            $tipo = 'CLAC';
        }
        
        return ['tipo' => $tipo, 'es_new_code' => $esNewCode];
    }

}
