<?php

class ReposicionController extends \BaseController {
	
	public static $jqgrid_colmodel = [
		[
			'label' => 'Código',
			'name' => 'CODIGO'
		],
		[
			'label' => 'Nombre Producto',
			'name' => 'NOMBRE'
		],
		[
			'label' => 'Nombre Base',
			'name' => 'NOMBRE_MATERIA_PRIMA'
		],
		[
			'label' => 'Vta.Men',
			'name' => 'VTA_MEN'
		],
		[
			'label' => 'Stock',
			'name' => 'STOCK',
		],
		[
			'label' => 'Nvs',
			'name' => 'NVS',
		],
		[
			'label' => 'Disponible',
			'name' => 'DISP',
		],
		[
			'label' => 'Stock Días',
			'name' => 'STOCKDIAS',
		],
		[
			'label' => 'Fecha Quiebre',
			'name' => 'FECHAQUIEBRE',
		],
		[
			'label' => 'Cant Fabr',
			'name' => 'CANTIDADFABRICAR',
		],
		[
			'label' => 'Cant Litros',
			'name' => 'CANTIDADLITROS',
		],
		[
			'label' => 'Fecha Fabricación',
			'name' => 'FECHAPROXIMAFABRICACION',
		],
		[
			'label'  => 'COLOR',
			'name'   => 'COLOR',
			'hidden' => true
		],
	];

	public function index(){

		// Asignar el valor de timestamp a $hora
		$hora = \Carbon\Carbon::now();
    
		// Llamar a la función insertarProductosTemporalFecha con $hora como parámetro
		$hora  = 1111111111;
		$this->insertarProductosTemporalFecha($hora);

		/* Valores de titulo */
		$title = 'Planificador de reposición';
		Breadcrumb::append_crumb($title);
		Jqgrid::add_js_colmodel('reposicion', self::$jqgrid_colmodel);
		return View::make('reposicion.index', compact('title'));
	}

	public function datagrid() {
		Jqgrid::init('PRODUCTO_TEMPORAL_FECHA', self::$jqgrid_colmodel, self::jqgrid_format(), self::jqgrid_filter_format());
		Jqgrid::get_query()->where('HORA', '=', 1111111111);
		return Jqgrid::datagrid();
	}

	public function insertarProductosTemporalFecha($hora) {

        // Borra tabla
		DB::table('PRODUCTO_TEMPORAL_FECHA')
        ->where('HORA', $hora)
        ->delete();

        // Obtener los datos de la vista vReposicion
        $datos = DB::table('vReposicion')
				->select('CODIGO', 'NOMBRE', 'VTA_MEN', 'STOCK', 'NVS', 'DISP', 'STOCKDIAS', 'FECHAQUIEBRE', 'COLOR', 'CANTIDADFABRICAR', 'CANTIDADLITROS', 'NREGUIST_MPRI', 'NOMBRE_MATERIA_PRIMA', 'FECHAPROXIMAFABRICACION')
				->where('NOMBRE_MATERIA_PRIMA', '<>', '')
                ->get();

        // Insertar manualmente el valor de hora en cada fila de los datos

		foreach ($datos as $dato) {
	//		$fechaQuiebre                  = \Carbon\Carbon::parse($dato->FECHAQUIEBRE)->format('d/m/Y');
	//		$fechaProximaFabricacion       = \Carbon\Carbon::parse($dato->FECHAPROXIMAFABRICACION)->format('d/m/Y');

			$fechaQuiebre                  = $dato->FECHAQUIEBRE;
			$fechaProximaFabricacion       = $dato->FECHAPROXIMAFABRICACION;

			DB::table('PRODUCTO_TEMPORAL_FECHA')->insert([
					'CODIGO'                  => $dato->CODIGO,
					'NOMBRE'                  => $dato->NOMBRE,
					'VTA_MEN'                 => $dato->VTA_MEN,
					'STOCK'                   => $dato->STOCK,
					'NVS'                     => $dato->NVS,
					'DISP'                    => $dato->DISP,
					'STOCKDIAS'               => $dato->STOCKDIAS,
					'FECHAQUIEBRE'            => $fechaQuiebre,
					'COLOR'                   => $dato->COLOR,
					'CANTIDADFABRICAR'        => $dato->CANTIDADFABRICAR,
					'CANTIDADLITROS'          => $dato->CANTIDADLITROS,
					'NREGUIST_MPRI'           => $dato->NREGUIST_MPRI,
					'NOMBRE_MATERIA_PRIMA'    => $dato->NOMBRE_MATERIA_PRIMA,
					'FECHAPROXIMAFABRICACION' => $fechaProximaFabricacion,
					'HORA'                    => $hora
			]);
	    }


		/* Agrupa las materia primas por fecha */
        $resultados = DB::select("SELECT NOMBRE_MATERIA_PRIMA, MAX(FECHAPROXIMAFABRICACION) FECHAPROXIMAFABRICACION
                                  FROM PRODUCTO_TEMPORAL_FECHA WITH (NOLOCK) GROUP BY NOMBRE_MATERIA_PRIMA ORDER BY NOMBRE_MATERIA_PRIMA");

        /* Verfica que la fecha tenga máximo 6 tareas por día, no en fin de semana */
        foreach ($resultados as $resultado) {
             $nombreMateriaPrima      = $resultado->NOMBRE_MATERIA_PRIMA;
             $fechaProximaFabricacion = $resultado->FECHAPROXIMAFABRICACION;

			 // Convertimos la fecha a un objeto Carbon para poder trabajar con ella
			 $fechaCarbon             = \Carbon\Carbon::parse($fechaProximaFabricacion);

			 /* Verifica si cumple o no can las condiciones de la fecha, no fin de semana, no feriado, por día sólo 6 */
			 $salirDelLoop            = false;
			 $ciclo                   = 0;

			 while ($salirDelLoop    == false)
			 {
				/* Inicia con debeGrabarFecha */
				$debeGrabarFecha      = 1;

				/* Verifica que no sea fin de semana */

				if ($fechaCarbon->isWeekday())
				{
					/* Agrupa las fecha */
					$resultadoFabricacion = DB::selectOne("SELECT COUNT(*) AS CANTIDAD 
					FROM PRODUCTO_TEMPORAL_FECHA WITH (NOLOCK) 
					WHERE NOMBRE_MATERIA_PRIMA <> '$nombreMateriaPrima' AND FECHAPROXIMAFABRICACION = '$fechaCarbon'");
					
					$cantidad             = intval($resultadoFabricacion->CANTIDAD);
					
					/* Verifica que no sea fin de semana */
     				if ($cantidad > 6)
    				{
    					 /* Le suma un día */
                         $fechaCarbon->addDay();
    					 /* Hay un error no debe grabar la fecha, por eso debeGrabarFecha = false */
    					 $debeGrabarFecha   = 0;
					}
					else
					{
						 $salirDelLoop      = true;
					}
				}
				else
				{
		            /* Le Suma un día */
                    $fechaCarbon->addDay();

		            /* Hay un error no debe grabar la fecha, por eso debeGrabarFecha = false */
                    $debeGrabarFecha   = 0;
				}
				
				$ciclo ++;
				if ($ciclo > 1000)
				{
					$salirDelLoop    = true;
				}
			 } 

			 /* Graba si no errores */
			 /* Si todo está bien, actualiza la fecha */
			 DB::update("UPDATE PRODUCTO_TEMPORAL_FECHA 
			 SET FECHAPROXIMAFABRICACION = '$fechaCarbon'
			 WHERE NOMBRE_MATERIA_PRIMA  = '$nombreMateriaPrima' AND FECHAPROXIMAFABRICACION = '$fechaProximaFabricacion'");			 

             // Aquí puedes hacer lo que necesites con el nombre de la materia prima y la fecha procesada
             // Por ejemplo, imprimirlos
			 /*
             echo "Materia prima: $nombreMateriaPrima, Cantidad: $cantidad, Fecha próxima fabricación: $fechaProximaFabricacion\n";
			 */
		   
        }
	}
	
	/**
	 * Retorna funcion anonima que define los formatos para los valores de las distintas columnas de la grilla
	 * @return function
	 */	
	
	 private static function jqgrid_format() {
		return function ($column, $value) 
		{
			$result     = $value;
//			$colorFondo = 'green';
				
			if (in_array($column, ['FECHAQUIEBRE'])) {
				// Verificar si el campo 'COLOR' es igual a 1
				/*
				if (isset($row['COLOR']) && $row['COLOR'] == 1) {
					// Aplicar color de fondo rojo al campo 'FECHAQUIEBRE'
					$colorFondo = 'red';
				}
				*/
				// Aplicar color de fondo a la celda 'FECHAQUIEBRE' según el valor de 'COLOR'
//				$result = "<div style='color: white; background-color: $colorFondo; text-align: center; padding: 5px;'>$value</div>";
				$result = "<div style='text-align: center; padding: 5px;'>$value</div>";

			}
	
			if (in_array($column, ['FECHAPROXIMAFABRICACION'])) {
				// Formatear la fecha en el formato 'd-m-Y'
				$result = date('d/m/Y', strtotime($value));
			}
	
			return $result;
		};
	}

	/**
	 * Retorna funcion anonima que define los formatos de búsqueda para los valores de las distintas columnas de la grilla
	 * @return function
	 */
	private static function jqgrid_filter_format() {
		return function ($field, $data) {
			$result = $data;
			if (in_array($field, ['FECHAQUIEBRE'])) {
				$values = explode(' | ', $data);
				$v1 = date('d-m-Y', strtotime($values[0]));
				$v2 = date('d-m-Y', strtotime($values[1]));
				$aux = "FECHA >= '$v1 00:00:00' AND FECHA <= '$v2 23:59:59'";
				$result = $aux;
			}
			if (in_array($field, ['FECHAPROXIMAFABRICACION'])) {
				$values = explode(' | ', $data);
				$v1 = date('d-m-Y', strtotime($values[0]));
				$v2 = date('d-m-Y', strtotime($values[1]));
				$aux = "FECHA >= '$v1 00:00:00' AND FECHA <= '$v2 23:59:59'";
				$result = $aux;
			}
			return $result;
		};
	}

    public function exportarExcel()
    {
		$productos = DB::table('PRODUCTO_TEMPORAL_FECHA')
			->select(DB::raw("CODIGO Código, NOMBRE Nombre_Producto, NOMBRE_MATERIA_PRIMA Nombre_Base, VTA_MEN Vta_Men, STOCK Stock, NVS Nvs, DISP Disponible, STOCKDIAS Stock_Días, FECHAQUIEBRE Fecha_Quiebre, CANTIDADFABRICAR Cant_Fabricar, CANTIDADLITROS Cant_Litros, FECHAPROXIMAFABRICACION Fecha_Fabricación"))
			->orderBy('CODIGO', 'desc')
			->get();

        // Modificar el formato de la fecha
        foreach ($productos as $producto) {
                 $producto->Fecha_Fabricación = \Carbon\Carbon::parse($producto->Fecha_Fabricación)->format('d/m/Y');
				 $producto->Fecha_Quiebre  = array("v" => $producto->Fecha_Quiebre, "s" => array( "fill" => array( "fgColor" => array( "rgb" => "green"))));
        }

		return \Response::json($productos);
	}

    public function events()
    {
        // Segunda consulta: Planificación
        $productos = DB::table('vPlanificacionGranel')
        ->select(DB::raw("flag, rtrim(ltrim(title)) as title, max(start) as start, max(color) color"),)
        ->groupBy('flag')
        ->groupBy('title')
		->get();

		return \Response::json($productos);
	}

    public function grabaPlanificacion()
    {
	//		$fechaQuiebre                  = \Carbon\Carbon::parse($dato->FECHAQUIEBRE)->format('d/m/Y');
	//		$fechaProximaFabricacion       = \Carbon\Carbon::parse($dato->FECHAPROXIMAFABRICACION)->format('d/m/Y');

     	$NOMBRE_PRODUCTO               = Input::get('NOMBRE_PRODUCTO');
     	$FECHA                         = Input::get('START');

		/* Lee nreguist de producto */
		$resultadoGranel               = DB::selectOne("SELECT MAX(NREGUIST) AS NREGUIST
		FROM ART_DB WITH (NOLOCK) WHERE RTRIM(LTRIM(NOMBRE)) = '$NOMBRE_PRODUCTO'");

        $NREGUIST_PROD                 = intval($resultadoGranel->NREGUIST);
		$CANTIDAD                      = 1000;

	    /* Graba Planificación */
 	    DB::table('PRODUCCION_PLANIFICACION')->insert([
			'NREGUIST_PROD'           => $NREGUIST_PROD,
			'CANTIDAD'                => $CANTIDAD,
			'FECHA'                   => $FECHA,
			'ESTADO'                  => 1,
			'NROVALE'                 => NULL,
			'LOTE'                    => NULL,
			'NROGR'                   => NULL,
			'FECHA_ELABORACION'       => NULL,
			'FECHA_VENCIMIENTO'       => NULL,
    	]);

		return \Response::json([
			'success' => true,
			'message' => "Plaficicación ha sido grabada correctamente."
		]);
	}

	/**
	 * Muestra vista agregar planificacion
	 *
	 * @return Response
	 */
	public function vista_agregar() {
		$title = 'Planificador de reposición';
		Breadcrumb::append_crumb($title);
		return View::make('reposicion.agregar', compact('title'));
	}


	/**
	 * Muestra Vista de editar fórmula
	 *
	 * @return \Illuminate\Http\Response
	 */
	public function editar_reposicion($id) {
		$title = 'Editar';
		Breadcrumb::append_crumb('Planificación de reposición');
		Breadcrumb::append_crumb($title);

		$planificacion     = DB::table('vPlanificacion')->where('ID', '=', $id)->first();

		return View::make('planificador.fecha', compact('id', 'title', 'planificacion'));
	}
}