package com.cn.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.cn.dao.MemberDao;
import com.cn.dao.impl.MemberDaoImpl;
import com.cn.domain.Member;
import com.cn.domain.Pmember;
import com.cn.service.MemberService;
import com.cn.service.PmemberService;
import com.cn.service.impl.MemberServiceImpl;
import com.cn.service.impl.PmemberServiceImpl;
import com.cn.util.DateUtil;

import cn.hutool.crypto.SecureUtil;

/**
 * 会员注册的Servlet
 */
public class RegMemberServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * 处理GET请求的方法。
     * 当客户端发送GET请求到此Servlet时，这个方法会被调用。
     * @param request HttpServletRequest对象，包含客户端请求信息。
     * @param response HttpServletResponse对象，用于发送响应到客户端。
     * @throws ServletException 可能抛出的Servlet异常。
     * @throws IOException 可能抛出的IO异常。
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 从请求中获取用户名和密码参数
        String userName = request.getParameter("username");
        String password = request.getParameter("password");
        
        // 获取PrintWriter对象，用于向客户端发送响应
        PrintWriter out = response.getWriter();
        
        // 创建MemberDao的实现类对象，用于访问会员相关的数据库操作
        MemberDao memberDao = new MemberDaoImpl();
        // 创建MemberService的实现类对象，用于访问会员相关的业务逻辑
        MemberService memberService = new MemberServiceImpl(memberDao);
        
        // 校验用户名是否已经存在
        if(memberService.getMemberByName(userName) == null) {
            // 不存在，可以创建
            // 创建新的会员对象，并设置注册时间和登录时间
            Member member = new Member(userName, password, DateUtil.now(), 0, DateUtil.now());
            // 将会员对象添加到数据库
            int countNumber = memberService.addMember(member);
            
            if(countNumber == 1) {
                // 添加成功，将个人信息存储到pmember
                Pmember pmember = new Pmember();
                // 获取刚注册会员的ID
                Integer memberId = memberService.getMemberByName(userName).getMemberId();
                pmember.setMemberId(memberId);
                
                // 从请求中获取个人信息参数
                String realName = request.getParameter("realName");
                String sex = request.getParameter("sex");
                Integer age = Integer.valueOf(request.getParameter("age"));
                String idCard = request.getParameter("idCard");
                
                // 设置pmember对象的个人信息
                pmember.setRealName(realName);
                pmember.setSex(sex);
                pmember.setAge(age);
                pmember.setIdCard(idCard);
                
                // 创建PmemberService的实现类对象，用于访问会员个人信息相关的业务逻辑
                PmemberService pmemberService = new PmemberServiceImpl();
                // 将pmember对象添加到数据库
                pmemberService.add(pmember);
                
                // 输出JavaScript代码，用于弹出注册成功提示，并跳转到登录页面
                out.write("<script>alert('注册成功，点击登录！');window.location.href='pages/user/memberLogin.jsp'</script>");
            } else {
                // 输出JavaScript代码，用于弹出注册失败提示，并跳转到注册页面
                out.write("<script>alert('注册失败！');window.location.href='pages/user/memberReg.jsp'</script>");
            }
        } else {
            // 输出JavaScript代码，用于弹出用户名已存在提示，并跳转到添加会员页面
            out.write("<script>alert('用户名已存在，请重新输入！');window.location.href='pages/admin/right/addMember.jsp'</script>");
        }
        // 关闭PrintWriter对象
        out.close();
    }

    /**
     * 处理POST请求的方法。
     * 当客户端发送POST请求时，这个方法会被调用。
     * @param request HttpServletRequest对象，包含客户端请求信息。
     * @param response HttpServletResponse对象，用于发送响应到客户端。
     * @throws ServletException 可能抛出的Servlet异常。
     * @throws IOException 可能抛出的IO异常。
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}