package com.jang.doc.controller;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;

import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.jang.doc.model.User;
import com.jang.doc.service.UserService;

@Controller
public class LoginController {

	@Resource(name = "userService") // @Autowired ÀÇÁ¸°ü°è ÁÖÀÔ
	private UserService userService; // ÀÇÁ¸°ü°è ¼³Á¤

	@RequestMapping(value = "/login", method = RequestMethod.GET)
	public String gotoLoginView(Model model, HttpSession session) {
		model.addAttribute("user", new User());
		return "loginForm";
	}

	@RequestMapping(value = "/login", method = RequestMethod.POST)
	public String onSubmit(@ModelAttribute @Valid User user, BindingResult result, Model model, HttpSession session) {

		if (result.hasFieldErrors("id") || result.hasFieldErrors("pass")) {
			model.addAllAttributes(result.getModel());
			return "loginForm";

		}
		try {
			User loginUser = this.userService.getUser(user.getId());

			if (user.getPass().equals(loginUser.getPass())) {
				model.addAttribute("loginUser", loginUser);
				session.setAttribute("userid", loginUser.getId()); // ¼¼¼Ç¿¡ º¯¼öµî·Ï
				session.setAttribute("userName", loginUser.getName());// ¼¼¼Ç¿¡ º¯¼öµî·Ï
				return "loginSuccess";
			} else {
				model.addAttribute("errMsg", "ÆÐ½º¿öµå°¡ ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù.");
				return "loginForm";
			}
		} catch (EmptyResultDataAccessException e) {
			model.addAttribute("errMsg", "»ç¿ëÀÚ°¡ µî·ÏµÇ¾îÀÖÁö ¾Ê½À´Ï´Ù.");
			return "loginForm";

		}

	}
	@RequestMapping(value="/edit", method = RequestMethod.GET) //"/edit"¶ó´Â URLÀÌ¶û ´ÙÀ½¿¡ ¿À´Â ÇÔ¼ö¶û ¸ÅÇÎ½ÃÅ´, GET¹æ½Ä 
	public String toUserEditView(@RequestParam("userId") String userId, Model model) {//modelÀº ºó°¡¹æ
		try {
			User loginUser = this.userService.getUser(userId);
			model.addAttribute("user", loginUser);
			return "editForm";
		}
		catch(EmptyResultDataAccessException e) {
			model.addAttribute("user", new User());
			model.addAttribute("errMsg","»ç¿ëÀÚ°¡ µî·ÏµÇ¾îÀÖÁö ¾Ê½À´Ï´Ù.");
			return "loginForm";
		}
	}

	@RequestMapping(value = "/edit", method = RequestMethod.POST)
	public String onSubmit(@Valid User user, BindingResult result, Model model) throws Exception {
		// System.out.println("");
		if (result.hasErrors()) {
			model.addAllAttributes(result.getModel());
			return "editFrom";
		}
		try {
			this.userService.updataUser(user);
			model.addAttribute("message", "´ÙÀ½°ú °°ÀÌ »ç¿ëÀÚ Á¤º¸¸¦ ¼öÁ¤ÇÏ¿´½À´Ï´Ù.");
			model.addAttribute("user", user);
			return "joinSuccess";
		} catch (DataAccessException e) {
			model.addAttribute("errMsg", "»ç¿ëÀÚÁ¤º¸ ¼öÁ¤¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù.");
			return "editForm";

		}
	}
	
	@RequestMapping(value="/join.do", method = RequestMethod.GET) //"/join.do"¸¦ ´©¸£¸é È¸¿ø°¡ÀÔ ÆûÀ» ¶ç¿öÁÖ´Â °Í
	public String toUserEntryView(Model model) {
		model.addAttribute("user", new User()); 
		return "joinForm"; 
	}

	@RequestMapping(value = "/checkid.do", method = RequestMethod.GET)
	public String dupCheckId(@RequestParam("userId") String userId, Model model) {

		String message = "";
		int reDiv = 0; // returnDiv
		try {
			User loginUser = this.userService.getUser(userId);
			message = "ÀÌ¹Ì »ç¿ëµÈ ¾ÆÀÌµð ÀÔ´Ï´Ù.";
			reDiv = 0; // ¾µ ¼ö ¾øÀ½
			userId = "";

		} catch (EmptyResultDataAccessException e) { // ¿¡·¯°¡ ³ª¸é
			message = "»ç¿ë °¡´ÉÇÑ ¾ÆÀÌµð ÀÔ´Ï´Ù.";
			reDiv = 1; // ¾µ ¼ö ÀÖÀ½
		}
		model.addAttribute("user", new User());
		model.addAttribute("message", message);
		model.addAttribute("reDiv", reDiv);
		model.addAttribute("userId", userId);
		return "joinForm";
	}

	@RequestMapping(value = "/join.do", method = RequestMethod.POST) // È¸¿ø°¡ÀÔ ¿Ï·á
	public String onSubmit1(@Valid User user, BindingResult result, Model model) throws Exception {

		if (result.hasErrors()) {
			model.addAllAttributes(result.getModel());
			return "joinForm";
		}

		try {
			this.userService.insertUser(user);
			model.addAttribute("message", "´ÙÀ½°ú °°ÀÌ È¸¿ø°¡ÀÔÀÌ ¿Ï·áµÇ¾ú½À´Ï´Ù.");
			model.addAttribute("user", user);
			return "joinSuccess";

		} catch (DataIntegrityViolationException e) {
			model.addAttribute("errMsg", "È¸¿ø °¡ÀÔÀÌ ¿Ï·áµÇÁö ¸øÇÏ¿´½À´Ï´Ù. ´Ù½Ã ½ÃµµÇÏ¿© ÁÖ½Ê½Ã¿À.");
			return "joinForm";
		}
	}
	
	@RequestMapping(value = "/findId.do", method = RequestMethod.GET)
	public String gotoFindView(Model model, HttpSession session) {
		model.addAttribute("user", new User());
		return "findId";
	}
	@RequestMapping(value = "/findId.do", method = RequestMethod.POST)
	public String onSubmit2(@ModelAttribute @Valid User user, BindingResult result, Model model, HttpSession session) {

		if (result.hasFieldErrors("name") || result.hasFieldErrors("email")) {
			model.addAllAttributes(result.getModel());
			return "findId";

		}
		try {
			User loginUser = this.userService.getUser(user.getName());

			if (user.getEmail().equals(loginUser.getEmail())) {
				model.addAttribute("loginUser", loginUser);
				session.setAttribute("userName", loginUser.getName()); // ¼¼¼Ç¿¡ º¯¼öµî·Ï
				session.setAttribute("userEmail", loginUser.getEmail());// ¼¼¼Ç¿¡ º¯¼öµî·Ï
				return "findIdSuccess";
			} else {
				model.addAttribute("errMsg", "»ç¿ëÀÚ°¡ µî·ÏµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.");
				return "findId";
			}
		} catch (EmptyResultDataAccessException e) {
			model.addAttribute("errMsg", "»ç¿ëÀÚ°¡ µî·ÏµÇ¾îÀÖÁö ¾Ê½À´Ï´Ù.");
			return "findId";

		}

	}
	



	
	@RequestMapping("/logout.do")
	public String logout(HttpSession session) {
		session.invalidate();
		return "redirect:login.do"; //redirect: µÚ¿¡ ºä°¡ ¾Æ´Ï¶ó urlÀÌ ¿Â´Ù.(controller url ·Î ÀÌµ¿)
	}

}
