<?php

use Orm\Model;

/**
 * SETI Consultyn S.L.
 * www.seticonsultyn.es
 *
 * Copyright(c) 2011-2013
 *
 * @author    SETI Consultyn S.L. <contacto@seticonsultyn.es>
 * @copyright 2011-2013 SETI Consultyn S.L. http://seticonsultyn.com/copyright.txt
 * @license   SETI Consultyn Software License <license.txt>
 * @link      http://seticonsultyn.es
 */
class Model_Recipe extends Model{
	use  Trait_InutraliaWS;

    protected static $_table_name = 'recipes';

    protected static $_primary_key = array('id');

    protected static $_has_many = array(
        //CARGA INGREDIENTES CON CONDICIONES
    	'ingredients' => array(
            'key_from'       => 'id',
            'key_to'         => 'recipe_local_id',
            'model_to'       => 'Model_Ingredient',
            'cascade_delete' => false,
	        'conditions'     => array(
	        	'where'    => array('used' => 'N'),
		        'order_by' => array('used' => 'DESC'),
		        'group_by' => 'ingredient_id'
	        )
        ),
	    //FUERZA LA CARGA DE TODOS LOS INGREDIENTES
	    'all_ingredients' => array(
            'key_from'       => 'id',
            'key_to'         => 'recipe_local_id',
            'model_to'       => 'Model_Ingredient',
            'cascade_delete' => false
        ),
    );

    protected static $_observers = array(
        'Orm\\Observer_CreatedAt'=> array(
            'events' => array('before_insert'),
            'mysql_timestamp' => true,
            'property' => 'created_at',
            'overwrite' => true
        )
    );

    public static function get_recipes_current_week()
    {
    	//Devolvemos recetas guardadas en la base de datos que correspondan a esta vista.
	    return self::recipes_current_week()->get();
    }


	/**
	 * @desc Obtiene recetas personalizadas. Esta se utiliza para los ingredientes Random
	 * @return Model_Recipe|Model|\Orm\Query
	 * @throws Exception
	 */
    public static function get_custom_recipe()
    {
	    $recipes = self::recipes_current_week();

	    $recipes = $recipes->where('option','custom')->get_one();

	    if(!$recipes)
	    {
	    	$recipes = Model_Recipe::forge();

		    $recipes->week_year = date('W');
		    $recipes->year      = date('Y');
		    $recipes->user_id   = \Fuel\Core\Session::get('user_id');
		    $recipes->option    = "custom";

		    $recipes->save();
	    }

	    return $recipes;

    }


    /**
     * @return \Orm\Query
     */
	public static function recipes_current_week()
	{
		//Devolvemos recetas guardadas en la base de datos que correspondan a esta vista.
		return self::query()->where('week_year', date('W'))->where('year', date('Y'))->where('user_id', \Fuel\Core\Session::get('user_id'));
	}

	/**
	 * @desc Genera los ingredientes de una receta consultándolos a la API de iNutralia, si no están ya generados.
	 * @return array|bool|mixed
	 */
	public function load_ingredients()
    {
	    //Tres condiciones por las que salimos directamente.
	    //OPCIÓN 1: el producto ya se cargó anteriormente, por lo tanto no es necesario cargarlo de nuevo
	    //OPCIÓN 2: Si en algún momento ya se establecieron ingredientes, no se vuelven a cargar.
	    //OPCIÓN 3: Si recipe_id==null, se trata de una receta personalizada por lo tanto no existe en iNutralia, por lo tanto no hay que buscarla.
    	if($this->loaded=='S' ||  count($this->ingredients)>0 || $this->recipe_id == null)
	    {
		    return false;
	    }

	    try
	    {
	    	\DB::start_transaction();

	    	//Receta que se trae de la API de iNutralia
			$api_recipe = $this->ws_recipe_get($this->recipe_id);

			if(!$api_recipe && isset($api_recipe->ingredients) )
				return array();

			foreach ($api_recipe->ingredients as $ingredientRecipe)
	        {
	            $ingredient = Model_Ingredient::forge();

	            $ingredient->ingredient_id = $ingredientRecipe->id;

		        $ingredient->desc          = $ingredientRecipe->name;

		        $ingredient->used          = 'N';

		        $ingredient->created_at    = date("Y-m-d H:i:s");

		        $this->ingredients[]       =  $ingredient;
	        }

	        $this->loaded = 'S';

	        $this->save(true);

	    }
	    catch (Exception $e)
	    {
	    	Log::error($e->getMessage(). " Line: ".$e->getLine(). " File: ".$e->getFile());
	    	\DB::rollback_transaction();
	    	return false;
	    }

		\DB::commit_transaction();

    	return $this->ingredients;

    }

    /**
     *
     * Comprueba si tiene seleccinoada una receta.
     *
     * @param $recipe_id
     * @return bool
     */

    public static function exist_recipe($recipe_id){

        $return = self::recipes_current_week()->where('recipe_id',$recipe_id)->get_one();

	    return  $return ? true : false;

    }
}