# -*- coding: utf-8 -*-
import logging
import traceback
logging.basicConfig(level=logging.ERROR)

from flask import request
from flask_restx import Resource, Namespace, reqparse
import datetime
from src.common.util import *

Login = Namespace('login')

#메소드별 모델 생성
LoginPost = Login.schema_model('LoginPost',
	{
		"$schema": "http://json-schema.org/draft-04/schema#",
		"type": "object",
		"properties": {
			"timestamp": {
				"type": "string"
			},
			"userId": {
				"type": "string"
			},
			"userName": {
				"type": "string"
			},
			"userLevel": {
				"type": "integer"
			},
			"token": {
				"type": "string"
			},
			"refresh_token": {
				"type": "string"
			}
		},
		"required": [
			"timestamp",
			"userId",
			"userName",
			"userLevel",
			"token",
			"refresh_token"
		]
	}
)

@Login.route('',methods=['POST'])
class LoginApi(Resource):

	# swagger 파라미터
	swagger=Login.parser()
	swagger.add_argument('userId', required=True, location='body')
	swagger.add_argument('password', required=True, location='body')
	@Login.expect(swagger)

	# Example Value
	@Login.doc(model=LoginPost)

	def post(self):
		"""
		로그인
		필수 : userId, password
		일반 :
		"""

		statusCode=200
		data={'timestamp': datetime.datetime.now().isoformat()}

		# host 정보
		serverType,host,userIp=get_server_type(request)

		# 파라미터 정리
		parser=reqparse.RequestParser()
		parser.add_argument('userId', type=str, required=True)
		parser.add_argument('password', type=str, required=True)
		parameter=parser.parse_args()

		# DB 시작
		cursor=mysql_cursor(mysql_conn(serverType))

		try:
			hasParam=True
				  # 필수값 체크
			if 'userId' not in parameter or not parameter['userId']:
				hasParam=False

			if 'password' not in parameter or not parameter['password']:
				hasParam=False

			# 필수 값 체크
			if hasParam:
				userId=parameter['userId']
				password=parameter['password']

				# sql 구문보기
				sql="""SELECT seq, user_id, user_name, user_level
				FROM sy_user
				WHERE user_id = %s AND password = SHA2(%s, 256) AND login_yn = 'Y' AND delete_id IS NULL """
				cursor.execute(query=sql, args=(userId, password))
				result=cursor.fetchone()

				if result is not None:
					seq=result['seq']
					userId=result['user_id']
					userName=result['user_name']
					userLevel=result['user_level']

					# token 생성
					token=jwt_token_generator(seq=seq, userName=userName, userId=userId, scope=userLevel)
					refresh_token = jwt_refresh_token_generator(seq)

					# 토큰 업데이트
					sql="""UPDATE sy_user
					SET last_login_date= %s, last_login_ip = %s, login_count = login_count+1
					WHERE seq = %s"""
					cursor.execute(query=sql, args=(datetime.datetime.now(), userIp, seq))

					data['userId']=userName
					data['userName']=userName
					data['userLevel']=userLevel
					data['token'] = token
					data['refresh_token'] = refresh_token

				else:
					statusCode=404
					data['error']='아이디나 비밀번호가 일치하지 않습니다.'
			else:
				statusCode=404
				data['error']='No Parameter'

		except Exception as e:
			logging.error(traceback.format_exc())
			data['error']='exception error'
			statusCode=505
			return data, statusCode

		finally:
			# DB종료
			cursor.close()

		return json_null_to_empty(data), statusCode
