<?php

namespace app\controllers;

use Yii;
use app\models\Cotizaciones;
use app\models\CotizacionesSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\web\Response;
use app\models\CotizacionItems;
use yii\data\ActiveDataProvider;

class CotizacionesController extends Controller
{
    public function behaviors()
    {
        return array_merge(
            parent::behaviors(),
            [
                'verbs' => [
                    'class' => VerbFilter::className(),
                    'actions' => [
                        'delete' => ['POST'],
                        'save-items' => ['POST'], 
                        'aprobar' => ['POST'],  // ← AGREGAR ESTA LÍNEA

                    ],
                ],
            ]
        );
    }

   public function actionIndex()
{
    $searchModel = new CotizacionesSearch();
    $dataProvider = $searchModel->search($this->request->queryParams);

    return $this->render('index', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
}

    public function actionView($id)
    {
        $model = $this->findModel($id);

        $dataProvider = new ActiveDataProvider([
            'query' => $model->getCotizacionItems()->with('producto'),
            'pagination' => false,
        ]);

        return $this->render('view', [
            'model' => $model,
            'dataProvider' => $dataProvider,
        ]);
    }

    public function actionCreate()
    {
        $model = new Cotizaciones();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            
            $prefix = $model->tipo_documento;
            $correlativo = str_pad($model->id, 5, '0', STR_PAD_LEFT);
            
            $model->numero_orden = $prefix . '-' . date('Y') . '-' . $correlativo;
            $model->save(false, ['numero_orden']); 

            return $this->redirect(['view', 'id' => $model->id]);
        }

        return $this->render('create', [
            'model' => $model,
        ]);
    }

    public function actionUpdate($id)
    {
        $model = $this->findModel($id);

        if ($this->request->isPost && $model->load($this->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        }

        return $this->render('update', [
            'model' => $model,
        ]);
    }

    public function actionDelete($id)
    {
        $this->findModel($id)->delete();
        return $this->redirect(['index']);
    }

/**
 * Aprueba una cotización CLAC
 * @param int $id
 * @return \yii\web\Response
 */
public function actionAprobar($id)
{
    $model = $this->findModel($id);
    
    // Validar que sea tipo CLAC
    if ($model->tipo_documento !== 'CLAC') {
        Yii::$app->session->setFlash('error', 'Solo se pueden aprobar documentos tipo CLAC.');
        return $this->redirect(['view', 'id' => $id]);
    }
    
    // Validar que no esté ya aprobado
    if ($model->estado === 'Aprobado') {
        Yii::$app->session->setFlash('warning', 'Este documento ya está aprobado.');
        return $this->redirect(['view', 'id' => $id]);
    }
    
    // Cambiar estado a Aprobado
    $model->estado = 'Aprobado';
    
    if ($model->save(false, ['estado'])) {
        Yii::$app->session->setFlash('success', 'Cotización aprobada exitosamente.');
    } else {
        Yii::$app->session->setFlash('error', 'Error al aprobar la cotización.');
    }
    
    return $this->redirect(['view', 'id' => $id]);
}


    /**
     * Acción para guardar múltiples ítems mediante AJAX
     */
    public function actionSaveItems()
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

        // Validar que sea una petición AJAX POST
        if (!Yii::$app->request->isAjax || !Yii::$app->request->isPost) {
            throw new \yii\web\MethodNotAllowedHttpException('Método no permitido.');
        }

        // Obtener datos del POST
        $cotizacionId = Yii::$app->request->post('cotizacion_id');
        $itemsData = Yii::$app->request->post('Item');

        // Validar que se recibieron datos
        if (empty($itemsData)) {
            return [
                'success' => false, 
                'message' => 'No se recibieron datos de ítems para guardar.'
            ];
        }

        // Opcional: Validar que la cotización existe
        if (empty($cotizacionId) || !Cotizaciones::findOne($cotizacionId)) {
            return [
                'success' => false, 
                'message' => 'Cotización no válida.'
            ];
        }

        // Iniciar transacción
        $transaction = Yii::$app->db->beginTransaction();
        $savedCount = 0;
        $errors = [];

        try {
            foreach ($itemsData as $itemId => $data) {
                // Buscar el ítem
                $item = $this->findItemModel($itemId);
                
                // Cargar datos (sin prefijo porque ya vienen como Item[id][campo])
                if ($item->load($data, '')) {
                    if ($item->save()) {
                        $savedCount++;
                    } else {
                        $errors[$itemId] = $item->getErrors();
                    }
                } else {
                    $errors[$itemId] = ['load' => 'No se pudieron cargar los datos'];
                }
            }

            // Si no hay errores, commit
            if (empty($errors)) {
                $transaction->commit();
                return [
                    'success' => true, 
                    'message' => "Se guardaron $savedCount ítem(s) exitosamente."
                ];
            } else {
                $transaction->rollBack();
                return [
                    'success' => false, 
                    'message' => 'Errores de validación en algunos ítems.', 
                    'errors' => $errors
                ];
            }

        } catch (\Exception $e) {
            $transaction->rollBack();
            Yii::error('Error en actionSaveItems: ' . $e->getMessage());
            return [
                'success' => false, 
                'message' => 'Error inesperado del servidor: ' . $e->getMessage()
            ];
        }
    }

public function actionFinalizar($id)
{
    $model = $this->findModel($id);

    if (Yii::$app->request->isPost) {
        $accion = Yii::$app->request->post('accion'); // 'finalizar' o 'cancelar'
        
        if ($accion === 'finalizar') {
            $model->estado = 'Finalizado';
            if ($model->save(false)) {
                Yii::$app->session->setFlash('success', 'Documento finalizado exitosamente.');
            } else {
                Yii::$app->session->setFlash('error', 'Error al finalizar el documento.');
            }
        } elseif ($accion === 'cancelar') {
            $model->estado = 'Cancelado';
            if ($model->save(false)) {
                Yii::$app->session->setFlash('success', 'Documento cancelado exitosamente.');
            } else {
                Yii::$app->session->setFlash('error', 'Error al cancelar el documento.');
            }
        }
        
        return $this->redirect(['index']);
    }

    // Mostrar formulario de confirmación
    return $this->render('finalizar', [
        'model' => $model,
    ]);
}

    protected function findModel($id)
    {
        if (($model = Cotizaciones::findOne(['id' => $id])) !== null) {
            return $model;
        }

        throw new NotFoundHttpException('La cotización solicitada no existe.');
    }

    protected function findItemModel($id)
    {
        if (($model = CotizacionItems::findOne(['id' => $id])) !== null) {
            return $model;
        }

        throw new NotFoundHttpException('El ítem de cotización solicitado no existe.');
    }
}