<?php
class RadniNalogsController extends AppController {

	var $name = 'RadniNalogs';
	var $uses = array('RadniNalog');
	var $paginate = array(
		'limit' => 10,
		'order' => array('RadniNalog.created' => 'desc')
	);
	var $components = array(
		'Filter' => array(
			'index' => array(
				'customer_id' => array(
					'form_options' => array('label' => 'Customer', 'options' => 'Customers'),
					'filter_options' => array(),
				),
				'canceled' => array(
					'form_options' => array('label' => 'Status', 'options' => 'Filter.RadniNalog_cancel'),
					'filter_options' => array(),
				),
			)
		),
	);

	function beforeFilter() {
		parent::beforeFilter();
		$this->Auth->allow('*'); // Privremeno dozvoli sve akcije dok ne postaviš ACL
		$this->Auth->mapActions(array('cancel' => 'delete'));
	}

	function index() {
		$this->RadniNalog->recursive = 0;
		$items = $this->paginate();
		
		// Dohvati stavke za svaki radni nalog
		foreach ($items as $key => $item) {
			$stavke = $this->RadniNalog->RadniNalogStavka->find('all', array(
				'conditions' => array('RadniNalogStavka.radni_nalog_id' => $item['RadniNalog']['id']),
				'contain' => array('Article')
			));
			$items[$key]['RadniNalogStavka'] = array();
			foreach ($stavke as $s) {
				$items[$key]['RadniNalogStavka'][] = array_merge($s['RadniNalogStavka'], array('Article' => $s['Article']));
			}
		}
		
		$this->set('items', $items);
	}

	function view($id = null) {
		// Dohvati radni nalog
		$this->RadniNalog->recursive = 1;
		if (!$id || !($item = $this->RadniNalog->read(null, $id))) {
			$this->Session->setFlash(__('Invalid Radni Nalog', true) . ($id ? " #{$id}" : ""), 'default', array('class' => 'error'));
			$this->redirect(array('action' => 'index'));
		}
		
		// Dohvati stavke s artiklima
		$stavke = $this->RadniNalog->RadniNalogStavka->find('all', array(
			'conditions' => array('RadniNalogStavka.radni_nalog_id' => $id),
			'recursive' => 1
		));
		$item['RadniNalogStavka'] = array();
		foreach ($stavke as $s) {
			$item['RadniNalogStavka'][] = array_merge($s['RadniNalogStavka'], array('Article' => $s['Article']));
		}
		
		$this->set('item', $item);
	}

	function add() {
		if (!empty($this->data)) {
			// Kupac je obavezan
			if (empty($this->data['RadniNalog']['customer_id'])) {
				$this->Session->setFlash(__('Kupac je obavezan. Molimo odaberite kupca.', true), 'default', array('class' => 'error'));
				$this->_setFormData();
				return;
			}
			$this->RadniNalog->create();
			
			// Spremi prvo radni nalog
			if ($this->RadniNalog->save($this->data)) {
				$radniNalogId = $this->RadniNalog->id;
				
				// Spremi stavke s radni_nalog_id
				if (!empty($this->data['RadniNalogStavka'])) {
					foreach ($this->data['RadniNalogStavka'] as $stavka) {
						if (!empty($stavka['article_id'])) {
							$this->RadniNalog->RadniNalogStavka->create();
							$stavka['radni_nalog_id'] = $radniNalogId;
							$this->RadniNalog->RadniNalogStavka->save(array('RadniNalogStavka' => $stavka));
						}
					}
				}
				
				$this->Session->setFlash(__('Radni nalog je spremljen', true), 'default', array('class' => 'success'));
				$this->redirect(array('action' => 'index'));
			} else {
				$this->Session->setFlash(__('Radni nalog nije mogao biti spremljen. Pokušajte ponovo.', true), 'default', array('class' => 'error'));
			}
		}
		
		$this->_setFormData();
	}
	
	/**
	 * Pripremi podatke za formu (add/edit)
	 */
	function _setFormData() {
		$customers = $this->RadniNalog->Customer->find('list');
		$statuses = $this->RadniNalog->RadniNalogStatus->find('list');
		
		// Automobili s boljim prikazom
		$automobilData = $this->RadniNalog->Automobil->find('all', array(
			'order' => array('Automobil.marka' => 'ASC')
		));
		$automobili = array();
		foreach ($automobilData as $auto) {
			$label = $auto['Automobil']['marka'] . ' ' . $auto['Automobil']['tip'];
			if (!empty($auto['Automobil']['registarska_oznaka'])) {
				$label .= ' (' . $auto['Automobil']['registarska_oznaka'] . ')';
			}
			$automobili[$auto['Automobil']['id']] = $label;
		}
		
		// Uređaji s boljim prikazom
		$uredjajData = $this->RadniNalog->Uredjaj->find('all', array(
			'order' => array('Uredjaj.naziv_uredjaja' => 'ASC')
		));
		$uredjaji = array();
		foreach ($uredjajData as $ured) {
			$label = $ured['Uredjaj']['naziv_uredjaja'];
			if (!empty($ured['Uredjaj']['serijski_broj'])) {
				$label .= ' (SN: ' . $ured['Uredjaj']['serijski_broj'] . ')';
			}
			$uredjaji[$ured['Uredjaj']['id']] = $label;
		}
		
		// Artikli za stavke
		$this->loadModel('Article');
		$articles = $this->Article->find('list', array(
			'fields' => array('Article.id', 'Article.name'),
			'order' => array('Article.name' => 'ASC')
		));
		
		// Artikli s cijenama za JavaScript
		$articlesData = $this->Article->find('all', array(
			'fields' => array('Article.id', 'Article.name', 'Article.price_sell', 'Article.price_buy'),
			'order' => array('Article.name' => 'ASC')
		));
		$articlesDataIndexed = array();
		foreach ($articlesData as $art) {
			$articlesDataIndexed[$art['Article']['id']] = $art;
		}
		
		$this->set(compact('customers', 'statuses', 'automobili', 'uredjaji', 'articles', 'articlesData'));
		$this->set('articlesData', $articlesDataIndexed);
	}

	function edit($id = null) {
		// Dohvati radni nalog
		$this->RadniNalog->recursive = 1;
		if ((!$id && empty($this->data)) || ($id && !($item = $this->RadniNalog->read(null, $id)))) {
			$this->Session->setFlash(__('Invalid Radni Nalog', true) . ($id ? " #{$id}" : ""), 'default', array('class' => 'error'));
			$this->redirect(array('action' => 'index'));
		}
		
		if (!empty($this->data)) {
			// Kupac je obavezan
			if (empty($this->data['RadniNalog']['customer_id'])) {
				$this->Session->setFlash(__('Kupac je obavezan. Molimo odaberite kupca.', true), 'default', array('class' => 'error'));
				$this->_setFormData();
				return;
			}
			// Spremi radni nalog
			if ($this->RadniNalog->save($this->data)) {
				// Obriši stare stavke
				$this->RadniNalog->RadniNalogStavka->deleteAll(array('RadniNalogStavka.radni_nalog_id' => $id));
				
				// Spremi nove stavke
				if (!empty($this->data['RadniNalogStavka'])) {
					foreach ($this->data['RadniNalogStavka'] as $stavka) {
						if (!empty($stavka['article_id'])) {
							$this->RadniNalog->RadniNalogStavka->create();
							$stavka['radni_nalog_id'] = $id;
							$this->RadniNalog->RadniNalogStavka->save(array('RadniNalogStavka' => $stavka));
						}
					}
				}
				
				$this->Session->setFlash(__('Radni nalog je spremljen', true), 'default', array('class' => 'success'));
				$this->redirect(array('action' => 'index'));
			} else {
				$this->Session->setFlash(__('Radni nalog nije mogao biti spremljen. Pokušajte ponovo.', true), 'default', array('class' => 'error'));
			}
		}
		
		if (empty($this->data)) {
			// Dohvati stavke s artiklima za prikaz
			$stavke = $this->RadniNalog->RadniNalogStavka->find('all', array(
				'conditions' => array('RadniNalogStavka.radni_nalog_id' => $id),
				'recursive' => 1
			));
			$item['RadniNalogStavka'] = array();
			foreach ($stavke as $s) {
				$item['RadniNalogStavka'][] = $s['RadniNalogStavka'];
			}
			$this->data = $item;
		}
		
		$this->_setFormData();
	}

	function cancel($id = null) {
		if ((!$id && empty($this->data)) || ($id && !($item = $this->RadniNalog->read(null, $id)))) {
			$this->Session->setFlash(__('Invalid Radni Nalog', true) . ($id ? " #{$id}" : ""), 'default', array('class' => 'error'));
			$this->redirect(array('action' => 'index'));
		}

		if ($this->RadniNalog->cancelRadniNalog($id)) {
			$this->Session->setFlash(__('Radni nalog je storniran', true), 'default', array('class' => 'success'));
		} else {
			$this->Session->setFlash(__('Radni nalog nije mogao biti storniran', true), 'default', array('class' => 'error'));
		}
		$this->redirect(array('action' => 'index'));
	}

	function delete($id = null) {
		if (!$id || !$this->RadniNalog->read(null, $id)) {
			$this->Session->setFlash(__('Invalid Radni Nalog', true) . ($id ? " #{$id}" : ""), 'default', array('class' => 'error'));
			$this->redirect(array('action'=>'index'));
		}
		if ($this->RadniNalog->delete($id)) {
			$this->Session->setFlash(__('Radni nalog obrisan', true), 'default', array('class' => 'success'));
			$this->redirect(array('action'=>'index'));
		}
		$this->Session->setFlash(__('Brisanje radnog naloga nije uspjelo. Pokušajte ponovo.', true), 'default', array('class' => 'error'));
		$this->redirect(array('action' => 'index'));
	}

	/**
	 * Pretvori radni nalog u ponudu
	 * Kopira artikle iz radnog naloga u ponudu i prenosi automobil/uređaj kao dodatnu info
	 */
	function convert_to_offer($id = null) {
		if (!$id) {
			$this->Session->setFlash(__('Nevažeći radni nalog', true), 'default', array('class' => 'error'));
			$this->redirect(array('action' => 'index'));
		}

		// Dohvati radni nalog
		$this->RadniNalog->recursive = 1;
		$radniNalog = $this->RadniNalog->read(null, $id);

		if (empty($radniNalog)) {
			$this->Session->setFlash(__('Radni nalog nije pronađen', true), 'default', array('class' => 'error'));
			$this->redirect(array('action' => 'index'));
		}
		
		// Dohvati stavke radnog naloga direktno s artiklima
		$this->RadniNalog->RadniNalogStavka->recursive = 1;
		$stavke = $this->RadniNalog->RadniNalogStavka->find('all', array(
			'conditions' => array('RadniNalogStavka.radni_nalog_id' => $id)
		));
		$radniNalog['RadniNalogStavka'] = array();
		foreach ($stavke as $s) {
			$radniNalog['RadniNalogStavka'][] = array_merge($s['RadniNalogStavka'], array('Article' => $s['Article']));
		}

		// Kreiraj novu ponudu
		$this->loadModel('Offer');
		
		// Pripremi napomenu s informacijama o predmetu
		$note = 'Kreirano iz radnog naloga #' . $radniNalog['RadniNalog']['number'];
		if (!empty($radniNalog['RadniNalog']['napomena_ponuda'])) {
			$note .= "\n" . $radniNalog['RadniNalog']['napomena_ponuda'];
		}
		
		$offerData = array(
			'Offer' => array(
				'customer_id' => $radniNalog['RadniNalog']['customer_id'],
				'date' => date('Y-m-d H:i:s'),
				'document_date' => date('Y-m-d'),
				'vrijedi_do' => date('Y-m-d', strtotime('+7 days')),
				'status' => 'Poslana',
				'note' => $note,
				'radni_nalog_id' => $id,
				'automobil_id' => $radniNalog['RadniNalog']['automobil_id'],
				'uredjaj_id' => $radniNalog['RadniNalog']['uredjaj_id'],
				'price' => 0
			)
		);

		$this->Offer->create();
		if (!$this->Offer->save($offerData)) {
			$this->Session->setFlash(__('Greška pri kreiranju ponude.', true), 'default', array('class' => 'error'));
			$this->redirect(array('action' => 'view', $id));
		}
		
		$newOfferId = $this->Offer->id;
		
		// Kopiraj stavke artikala iz radnog naloga u ponudu
		// price_sell se dohvaća iz Article tablice
		$artiklCount = 0;
		$totalPrice = 0;
		
		if (!empty($radniNalog['RadniNalogStavka'])) {
			foreach ($radniNalog['RadniNalogStavka'] as $stavka) {
				if (!empty($stavka['article_id'])) {
					$this->Offer->OfferItem->create();
					
					// Dohvati price_sell i price_buy iz Article
					$price_sell = !empty($stavka['Article']['price_sell']) ? $stavka['Article']['price_sell'] : 0;
					$price_buy = !empty($stavka['Article']['price_buy']) ? $stavka['Article']['price_buy'] : 0;
					$amount = floatval($stavka['amount']);
					$discount = floatval($stavka['discount']);
					$price = $amount * $price_sell * (1 - $discount / 100);
					
					$offerItem = array(
						'OfferItem' => array(
							'offer_id' => $newOfferId,
							'article_id' => $stavka['article_id'],
							'amount' => $amount,
							'price_sell' => $price_sell,
							'discount' => $discount,
							'price' => $price,
							'price_buy' => $price_buy,
							'napomena' => !empty($stavka['napomena']) ? $stavka['napomena'] : null
						)
					);
					
					if ($this->Offer->OfferItem->save($offerItem)) {
						$artiklCount++;
						$totalPrice += $price;
					}
				}
			}
		}
		
		// Ažuriraj ukupnu cijenu ponude direktno u bazi (bez triggeranja beforeSave)
		$this->Offer->updateAll(
			array('Offer.price' => $totalPrice),
			array('Offer.id' => $newOfferId)
		);
		
		// Ažuriraj radni nalog - poveži s ponudom
		$this->RadniNalog->id = $id;
		$this->RadniNalog->saveField('offer_id', $newOfferId);
		
		$msg = __('Ponuda je uspješno kreirana iz radnog naloga', true);
		if ($artiklCount > 0) {
			$msg .= ' (' . $artiklCount . ' artikl(a))';
		}

		$this->Session->setFlash($msg, 'default', array('class' => 'success'));
		$this->redirect(array('controller' => 'offers', 'action' => 'edit', $newOfferId));
	}
	
	/**
	 * Pošalji radni nalog emailom
	 */
	function send_email($id = null, $with_notes = 0) {
		if (!$id) {
			$this->Session->setFlash(__('Neispravan radni nalog', true), 'default', array('class' => 'error'));
			$this->redirect(array('action' => 'index'));
		}
		
		$this->RadniNalog->contain('Customer', 'RadniNalogStatus');
		$item = $this->RadniNalog->read(null, $id);
		
		if (!$item) {
			$this->Session->setFlash(__('Radni nalog nije pronađen', true), 'default', array('class' => 'error'));
			$this->redirect(array('action' => 'index'));
		}
		
		$this->set('item', $item);
		$this->set('radni_nalog_id', $id);
		$this->set('with_notes', (int)$with_notes);
	}
}
