<?php

namespace Garradin\Plugin\Materiels;

use Garradin\DB;
use Garradin\Plugin\Materiels\Category;

class Equipment
{
  public function add($data = [])
	{
    $db = DB::getInstance();
		$db->insert('plugin_materiels_equipment', $data);
    return $db->lastInsertRowId();
	}

  public function edit($id, $data = [])
	{
    $db = DB::getInstance();
    $db->update('plugin_materiels_equipment', $data, $db->where('id', $id));
	}

  public function get($id)
  {
    return DB::getInstance()->first('SELECT * FROM plugin_materiels_equipment WHERE id = ?;', $id);
  }

  public function listAllByCategory()
  {
    $category = new Category;
    $cats = $category->listAll();
    $eqmts_by_cat = array();
    foreach ($cats as $cat) {
    	$eqmts_by_cat[$cat->name] = $category->listAllEquipments($cat->id);
    }
    return $eqmts_by_cat;
  }

  public function CalculateStock($id)
  {
    $entries = DB::getInstance()->firstColumn(
      "SELECT sum(equipment_number) FROM plugin_materiels_entry WHERE kind IN (
        'Achat', 'Don', 'Récupération') AND equipment_id = ?;", $id);
    $outputs = DB::getInstance()->firstColumn(
      "SELECT sum(equipment_number) FROM plugin_materiels_output WHERE kind IN (
        'Vente', 'Don', 'Besoin', 'Autre (perte, vol, ...)') AND equipment_id = ?;", $id);
    return $entries - $outputs;
  }

  public function CalculateOutOfStock($id)
  {
    $entries = DB::getInstance()->firstColumn(
      "SELECT sum(equipment_number) FROM plugin_materiels_entry WHERE kind = 'Retour de location / prêt' AND equipment_id = ?;", $id);
    $outputs = DB::getInstance()->firstColumn(
      "SELECT sum(equipment_number) FROM plugin_materiels_output WHERE kind = 'Location / Prêt' AND equipment_id = ?;", $id);
    return $outputs - $entries;
  }

  public function CalculateNoOwned($id)
  {
    $entries = DB::getInstance()->firstColumn(
      "SELECT sum(equipment_number) FROM plugin_materiels_entry WHERE kind = 'Location / Prêt' AND equipment_id = ?;", $id);
    $outputs = DB::getInstance()->firstColumn(
      "SELECT sum(equipment_number) FROM plugin_materiels_output WHERE kind = 'Retour de location / prêt' AND equipment_id = ?;", $id);
    return $entries - $outputs;
  }

  public function GetAllListByCategory()
  {
    $eqmts_by_cat = $this->listAllByCategory();
    $eqmts_owned_by_cat = array();
    $eqmts_no_owned_by_cat = array();
    $eqmts_just_listed_by_cat = array();
    foreach ($eqmts_by_cat as $cat => $eqmts) {
      $eqmts_owned = array();
      $eqmts_no_owned = array();
      $eqmts_just_listed = array();
      foreach ($eqmts as $eqmt) {
        $stock = $this->CalculateStock($eqmt->id);
        if ($stock) {
          $eqmt->stock = $stock;
          $out_of_stock = $this->CalculateOutOfStock($eqmt->id);
          if ($out_of_stock) {
            $eqmt->out_of_stock = $out_of_stock;
          } else {
            $eqmt->out_of_stock = 0;
          }
          array_push($eqmts_owned, $eqmt);
        }
        $no_owned = $this->CalculateNoOwned($eqmt->id);
        if ($no_owned) {
          $eqmt->no_owned = $no_owned;
          array_push($eqmts_no_owned, $eqmt);
        }
        if ($stock + $no_owned == 0) {
          array_push($eqmts_just_listed, $eqmt);
        }
      }
      $eqmts_owned_by_cat[$cat] = $eqmts_owned;
      $eqmts_no_owned_by_cat[$cat] = $eqmts_no_owned;
      $eqmts_just_listed_by_cat[$cat] = $eqmts_just_listed;
    }
    return array(
      $eqmts_owned_by_cat, $eqmts_no_owned_by_cat,
      $eqmts_just_listed_by_cat
    );
  }

  public function CalculateAvailable($id)
  {
    $entries = DB::getInstance()->firstColumn(
      "SELECT sum(equipment_number) FROM plugin_materiels_entry WHERE kind IN (
        'Achat', 'Don', 'Récupération',
        'Retour de location / prêt') AND equipment_id = ?;", $id);
    $outputs = DB::getInstance()->firstColumn(
      "SELECT sum(equipment_number) FROM plugin_materiels_output WHERE kind IN (
        'Vente', 'Don', 'Besoin', 'Autre (perte, vol, ...)',
        'Location / Prêt') AND equipment_id = ?;", $id);
    return $entries - $outputs;
  }

  public function GetAvailableListByCategory()
  {
    $eqmts_by_cat = $this->listAllByCategory();
    $eqmts_available_by_cat = array();
    foreach ($eqmts_by_cat as $cat => $eqmts) {
      $eqmts_available = array();
      foreach ($eqmts as $eqmt) {
        $available = $this->CalculateAvailable($eqmt->id);
        if ($available) {
          $eqmt->available = $available;
          array_push($eqmts_available, $eqmt);
        }
      }
      $eqmts_available_by_cat[$cat] = $eqmts_available;
    }
    return $eqmts_available_by_cat;
  }
}