package com.example.demo;

import java.time.LocalDateTime;
import java.time.LocalTime;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
	@RequestMapping("/")
	public String index() {
		return "index";
	}
	
	@RequestMapping("/hello")
	@ResponseBody
	public String sayHello() {
		return "Hello world";
	}

	@RequestMapping("/godzina1")
	// @RequestMapping(path="/godzina1", produces="text/plain")
	@ResponseBody
	public String ktoraGodzina1() {
		// To zostanie wysłane jako tekst
		return LocalTime.now().toString();
	}
	
	@RequestMapping("/godzina2")
	@ResponseBody
	public LocalTime ktoraGodzina2() {
		// To zostanie wysłane jako JSON
		return LocalTime.now();
	}
	
	@RequestMapping(path="/godzina3", produces="text/html")
	@ResponseBody
	public String ktoraGodzina3() {
		LocalTime now = LocalTime.now();
		return String.format("<html><body><p>Teraz jest godzina <strong>%s</strong></p></body></html>", now);
	}
	
	@RequestMapping(path="godzina4", produces="text/html")
	public String ktoraGodzina4(Model model) {
		// Aby przekazać dane z kontrolera do widoku, używa się "modelu",
		// który w Springu jest czymś konkretnym: obiekt, którego używa się podobnie jak mapy.
		// Zauważmy, że my tylko deklarujemy parametr typu Model, a to Spring utworzy ten obiekt i nam go przekaże.
		LocalDateTime now = LocalDateTime.now();
		model.addAttribute("dt", now);
		return "prezentuj_godzine";
	}
	
	@RequestMapping("/parametry")
	@ResponseBody
	public String rozmowa(String imie) {
		// Gdy metoda ma parametr typu String (także m.in. Integer, BigDecimal...)
		// i nie ma przy nim żadnej adnotacji, to Spring zakłada, że jest to parametr zapytania HTTP
		// i jeśli w zapytaniu wystąpił taki parametr, to przekazuje jego wartość,
		// a jeśli nie ma takiego parametru w zapytaniu, to przekazuje null.
		// Jeśli chcemy podać własne ustawienia, np. inną nazwę, to można użyć adnotacji @RequestParam.
		return "Witaj " + imie;
	}
	
	// Teraz zarówno tutaj, jak i w klasie KalkulatorController odwołujemy się do tego samego obiektu (bo komponenty Springa są singletonami)
	@Autowired
	private LogikaKalkulatora logikaKalkulatora;
	
	@RequestMapping("/hist")
	@ResponseBody
	public String ileElementowMaHistoria() {
		return "Historia ma elementów: " + logikaKalkulatora.getHistoriaDzialan().size();
	}
	
}
