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")
	private UserService userService;

	@RequestMapping(value="/join.do", method=RequestMethod.GET)
	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;
		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 onSubmit(@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="/login", method = RequestMethod.GET)
	public String gotoLoginView( Model model) {
		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)
	public String toUserEditView(@RequestParam("userId") String userId, 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 onSubmit2(@Valid User user, BindingResult result, Model model) throws Exception{
		if(result.hasErrors()) {
			model.addAllAttributes(result.getModel());
			return "editForm";
		}
		try {
			this.userService.updateUser(user);
			model.addAttribute("message", "´ÙÀ½°ú °°ÀÌ »ç¿ëÀÚ Á¤º¸¸¦ ¼öÁ¤ÇÏ¿´½À´Ï´Ù.");
			model.addAttribute("user",user);
			return "joinSuccess";
		}catch(DataAccessException e) {
			model.addAttribute("errMsg","»ç¿ëÀÚÁ¤º¸ ¼öÁ¤¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù.");
			return "editForm";
		}
	}
	
	@RequestMapping("/logout.do")
	public String logout(HttpSession session) { 
		session.invalidate(); //¼¼¼Ç Áö¿ì±â
		return "redirect:login.do"; //login.do url·Î ¹Ù·Î °¡±â
	}
	
	@RequestMapping(value="/findId.do", method=RequestMethod.GET)
	public String toUserFindId(Model model) {
		model.addAttribute("user",new User());
		return "findId";
	}
	
	@RequestMapping(value="/findId.do", method=RequestMethod.POST)
	public String onfindId(@ModelAttribute @Valid User user, BindingResult result, @RequestParam("name")String name, @RequestParam("email")String email, Model model,HttpSession session) {
			
		if(result.hasFieldErrors("name")||result.hasFieldErrors("email")){
			model.addAllAttributes(result.getModel());
			return "findId";
		}
		
		try {
			user = this.userService.findId(user.getName(),user.getEmail());
			model.addAttribute("message","¼º°ø");
			model.addAttribute("user",user);
			return "findIdSuccess";
			
		}catch(EmptyResultDataAccessException e) {
			model.addAttribute("message","½ÇÆÐ");
			return "findId";
		}
	}
	
	@RequestMapping(value="/findPass.do", method=RequestMethod.GET)
	public String toUserFindPass(Model model) {
		model.addAttribute("user",new User());
		return "findPass";
	}
	
	@RequestMapping(value="/findPass.do", method=RequestMethod.POST)
	public String onfindPass(@ModelAttribute @Valid User user, BindingResult result, Model model) {
		try {
			user = this.userService.findPass(user.getId(),user.getEmail());
			model.addAttribute("message","¼º°ø");
			model.addAttribute("user",user);
			return "findPassForm";
		}catch(EmptyResultDataAccessException e) {
			model.addAttribute("message","½ÇÆÐ");
			return "findPass";	
		}
	}
	


	@RequestMapping(value="/findPassForm.do", method= RequestMethod.GET)
	public String toUserPassForm(@Valid User user, @RequestParam("email") String email, @RequestParam("id")String id, Model model) {
		model.addAttribute("user",new User());
		return "findPassForm";
	}
	
	@RequestMapping(value="/findPassForm.do", method=RequestMethod.POST)
	public String updatePass(@ModelAttribute @Valid User user, BindingResult result,@RequestParam("id")String id, @RequestParam("pass")String pass, Model model,HttpSession session) {
		try {
			this.userService.updatePass(user);
			model.addAttribute("message","¼º°ø");
			model.addAttribute("user",user);
			return "findPassSuccess";
		}catch(DataIntegrityViolationException e) {
			model.addAttribute("message","½ÇÆÐ");
			return "findPass";	
		}
	}
	
	
	

	
	
}
