<?php

use \Slim\Http\Request as Request;
use \Slim\Http\Response as Response;
use App\Model\Presupuesto;
$app->get('/presupuestos/{id}', function (Request $request,  Response $response, $args) {
    $uptate = $request->getHeader("update-presu")[0];
    if($uptate=="none" || true)
        $objects = Presupuesto::all(
            array("conditions" => "trim(psp_codvdd) in ('".str_replace(",","','",$args['id'])."')",
            'limit' => 200, 'order' => 'psp_numero desc')
        );
    else
        $objects = Presupuesto::all(
            array("conditions" => "psp_update > '".$uptate."' and trim(psp_codvdd) in ('".str_replace(",","','",$args['id'])."')",
            'limit' => 200, 'order' => 'psp_numero desc')
        );

    $response->getBody()->write(Presupuesto::toJSON($objects));

    return $response;
});

$app->get('/presupuestos/limit/id={id}&limit={limit}', function (Request $request,  Response $response, $args) {
    $uptate = $request->getHeader("update-presu")[0];
    if($uptate=="none" || true)
        $objects = Presupuesto::all(
            array("conditions" => "trim(psp_codvdd) in ('".str_replace(",","','",$args['id'])."')",
                'limit' => $args['limit'], 'order' => 'psp_numero desc')
        );
    else
        $objects = Presupuesto::all(
            array("conditions" => "psp_update > '".$uptate."' and trim(psp_codvdd) in ('".str_replace(",","','",$args['id'])."')",
                'limit' => $args['limit'], 'order' => 'psp_numero desc')
        );
        
    $response->getBody()->write(Presupuesto::toJSON($objects));

    return $response->withAddedHeader('update-presu', date('Y-m-d '.'00:00:00'));
});

$app->post('/presupuestos/list', function (Request $request,  Response $response, $args) {
    $atts = json_decode($request->getBody());;
    $objects = array();
    foreach($atts as $att){
        $objects[] = insertarPresupuesto($att);
    }
    $response->getBody()->write(Presupuesto::toJSON($objects));
    return $response->withHeader("Update", date("Y-m-d H:i:s"));
});

$app->post('/presupuestos/delete', function (Request $request,  Response $response, $args) {
    $atts = json_decode($request->getBody());
    foreach($atts as $att) {
        \App\Model\PresupuestoItem::delete_all(array('conditions' => array('pit_nropsp' => $att->codigoPresupuesto)));
        Presupuesto::find($att->codigoPresupuesto)->delete();
    }
    return $response;
});

$app->post('/presupuestos', function (Request $request,  Response $response, $args) {
    $att = json_decode($request->getBody());
    $response->getBody()->write(Presupuesto::toJSON(insertarPresupuesto($att)));
    return $response;
});

$app->put('/presupuestos/list', function (Request $request,  Response $response, $args) {
    $atts = json_decode($request->getBody());
    $objects = array();
    foreach($atts as $att){
        $objects[] =  actualizarPresupuesto($att);
    }
    $response->getBody()->write(Presupuesto::toJSON($objects));
    return $response->withHeader("Update", date("Y-m-d H:i:s"));
});

$app->put('/presupuestos', function (Request $request,  Response $response, $args) {
    $att = json_decode($request->getBody());
    $response->getBody()->write(Presupuesto::toJSON(actualizarPresupuesto($att)));
    return $response;
});


function actualizarPresupuesto($att){
    $object = Presupuesto::find($att->codigoPresupuesto);
    $object->cargar($att);
    $object->save();
    $idModificados = array();
    foreach($att->itemsPresupuesto as $item){
        $itemResults = array();
        foreach($object->items as $it){
            if($it->pit_codart == $item->articulo->id && !in_array($it->pit_numero,$idModificados)){
                $itemResults[] = $it;
            }
        }
        if(sizeof($itemResults)>0){
            $itemPresu = $itemResults[0];
        }else {
            $itemPresu = new \App\Model\PresupuestoItem();
        }
        $item->presupuesto = $object;
        $itemPresu->cargar($item);
        $itemPresu->save();
        $idModificados[] = $itemPresu->id;
    }
    foreach($object->items as $it){
        if(!in_array($it->pit_numero,$idModificados)){
            $it->delete();
        }
    }
    return $object;
}

function insertarPresupuesto($att){
    $object = checkUnico($att);
    if ($object != null) return $object;
    $object = new Presupuesto();
    $object->cargar($att);
    $object->save();
    foreach($att->itemsPresupuesto as $item){
        $itemPresu = new \App\Model\PresupuestoItem();
        $item->presupuesto = $object;
        $itemPresu->cargar($item);
        $itemPresu->save();
    }
    return $object;
}

function checkUnico($data)
{
    $object = Presupuesto::first(
        array(
            "conditions" => "trim(psp_codvdd) = '".trim($data->vendedor->id)."' 
            and trim(psp_codcli) = '".trim($data->cliente->id)."' 
            and psp_fecha = '".$data->fecha."'
            and psp_hora = '".$data->hora."'
            and psp_refrel = '".$data->id."'"
        )
    );
    if ($object == null) return null;
    $data->codigoPresupuesto = $object->psp_numero;
    $oldItems = $object->items;
    if (sizeof($oldItems) == sizeof($data->itemsPresupuesto)) {   
        $total1 = 0;
        $total2 = 0;
        foreach($oldItems as $oi) { 
            $total1 = $total1 + ($oi->pit_precio * $oi->pit_canti);
        }
        for ($n=0; $n < sizeof($data->itemsPresupuesto); $n++) { 
            $total2 = $total2 + ($data->itemsPresupuesto[$n]->precio * $data->itemsPresupuesto[$n]->cantidad);
        }
        if($total1 != $total2) $object = actualizarPresupuesto($data);
    } else $object = actualizarPresupuesto($data);
    return $object;
}
