# -*- coding: utf-8 -*-
import logging
from symbol import parameters
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 *

KioskLogin = Namespace('Kiosklogin')

#메소드별 모델 생성
KioskLoginPost = KioskLogin.schema_model('KioskLoginPost',
)

@KioskLogin.route('',methods=['POST'])
class KioskLoginApi(Resource):

    # swagger 파라미터
    swagger=KioskLogin.parser()
    swagger.add_argument('storeSeq', required=True, location='body')
    swagger.add_argument('userId', required=True, location='body')
    @KioskLogin.expect(swagger)

    # Example Value
    @KioskLogin.doc(model=KioskLoginPost)

    def post(self):
        """
        로그인
        필수 : storeSeq, userId
        일반 :
        """

        statusCode=200
        data={'timestamp': datetime.datetime.now().isoformat()}

        # host 정보
        serverType,host,userIp=get_server_type(request)

        # 파라미터 정리
        parser=reqparse.RequestParser()
        parser.add_argument('storeSeq', type=int, required=True)
        parser.add_argument('userId', type=str, required=True)
        parameter=parser.parse_args()

        # DB 시작
        cursor=mysql_cursor(mysql_conn(serverType))

        try:
            hasParam=True
                  # 필수값 체크
            if 'storeSeq' not in parameter or not parameter['storeSeq']:
                hasParam=False

            if 'userId' not in parameter or not parameter['userId']:
                hasParam=False

            # 필수 값 체크
            if hasParam:
                storeSeq = int(parameter['storeSeq'])
                userId = parameter['userId']

                sql = "SELECT * FROM sy_user WHERE user_id = %s AND login_yn = 'Y' AND delete_id IS NULL"
                cursor.execute(query=sql, args=userId)
                result =cursor.fetchone()

                if result is not None:
                    seq=result['seq']
                    userId=result['user_id']
                    userName=result['user_name']
                    userLevel=result['user_level']
                    localType = result['user_local_type']
                    agrSeq = result['agr_seq']
                    aniSeq = result['ani_seq']

                    # token 생성
                    token=jwt_token_generator_kiosk(seq=seq, userName=userName, userId=userId, scope=userLevel, 
                                                    localType=localType, agrSeq=agrSeq, aniSeq=aniSeq, aniSeq=aniSeq)
                    refresh_token = jwt_refresh_token_generator_kiosk(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))

                    orderLimit = ''

                    if storeSeq == 1 or storeSeq == '1':
                        if result['agr_seq'] is not None:
                            # 작물
                            if orderLimit != '':
                                orderLimit = orderLimit + ",'" + str(result['agr_seq']) + "'"
                            else:
                                orderLimit = orderLimit + "'" + str(result['agr_seq']) + "'"

                        if result['ani_seq'] is not None:
                            # 축산
                            if orderLimit != '':
                                orderLimit = orderLimit + ",'" + str(result['ani_seq']) + "'"
                            else:
                                orderLimit = orderLimit + "'" + str(result['ani_seq']) + "'"

                        if result['pol_seq'] is not None:
                            # 가금
                            if orderLimit != '':
                                orderLimit = orderLimit + ",'" + str(result['agr_pol_seqseq']) + "'"
                            else:
                                orderLimit = orderLimit + "'" + str(result['pol_seq']) + "'"
                    else:
                        if result['agr_seq'] is not None:
                            # 작물
                            if orderLimit != '':
                                orderLimit = orderLimit + ",'" + str(result['agr_seq']) + "'"
                            else:
                                orderLimit = orderLimit + "'" + str(result['agr_seq']) + "'"

                    itemList = []
                    if orderLimit != '':
                        sql = """SELECT limit_type FROM sy_order_limit
                        WHERE seq in (%s) AND delete_id IS NULL""" % orderLimit
                        cursor.execute(query=sql)

                        for row in cursor.fetchall():
                            item = {}
                            item['growType'] = row['limit_type']
                            item['growTypeNm'] = CommonCode.growTypeList[row['limit_type']-1]['val']
                            itemList.append(item)

                    data['userSeq'] = seq
                    data['userId'] = userId
                    data['userName'] = userName
                    data['userLevel'] = userLevel
                    data['localType'] = localType
                    data['agr_seq'] = agrSeq
                    data['ani_seq'] = aniSeq
                    data['token'] = token
                    data['refresh_token'] = refresh_token
                    data['growTypeList'] = itemList

                else:
                    statusCode=400
                    data['error']='아이디가 일치하지 않습니다'
                    data['userId'] = userId

            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
