# -*- coding: utf-8 -*-
"""
@File: auth.py
@Date: 2020-09-14
@author: A2TEC
@section MODIFYINFO 수정정보
- 수정자/수정일   : 수정내역
- 2022-01-14/hsj100@a2tec.co.kr : refactoring
@brief: authentication api
"""

from itertools import groupby
from operator import attrgetter
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
import bcrypt
import jwt
from datetime import datetime, timedelta

from vector_rest.app.common import consts
from vector_rest.app import models as M
from vector_rest.app.database.conn import db
from vector_rest.app.common.config import conf
from vector_rest.app.database.schema import Users, UserLog
from vector_rest.app.utils.extra import query_to_groupby, AESCryptoCBC
from vector_rest.app.utils.date_utils import D

router = APIRouter(prefix='/auth')


@router.get('/find-account/{account}', response_model=M.ResponseBase, summary='계정유무 검사')
async def find_account(account: str):
    """
    ## 계정유무 검사

    주어진 계정이 존재하면 true, 없으면 false 처리

    **결과**
      - ResponseBase
    """
    try:
        search_info = Users.get(account=account)
        if not search_info:
            raise Exception(f'not found data: {account}')
        return M.ResponseBase()
    except Exception as e:
        return M.ResponseBase.set_error(str(e))


@router.post('/logout/{account}', status_code=200, response_model=M.TokenRes, summary='사용자 접속종료')
async def logout(account: str):
    """
    ## 사용자 접속종료

    현재 버전에서는 로그인/로그아웃의 상태를 유지하지 않고 상태값만을 서버에서 사용하기 때문에,\n
    ***로그상태는 실제상황과 다를 수 있다.***

    정상처리시 Authorization(null) 반환

    **결과**
      - TokenRes
    """
    user_info = None

    try:
        # TODO(hsj100): LOGIN_STATUS
        user_info = Users.filter(account=account)
        if not user_info:
            raise Exception('not found user')

        user_info.update(auto_commit=True, login='logout')
        return M.TokenRes()
    except Exception as e:
        if user_info:
            user_info.close()
        return M.ResponseBase.set_error(e)


async def is_account_exist(account: str):
    get_account = Users.get(account=account)
    return True if get_account else False


def create_access_token(*, data: dict = None, expires_delta: int = None):

    if conf().GLOBAL_TOKEN:
        return conf().GLOBAL_TOKEN

    to_encode = data.copy()
    if expires_delta:
        to_encode.update({'exp': datetime.utcnow() + timedelta(hours=expires_delta)})
    encoded_jwt = jwt.encode(to_encode, consts.JWT_SECRET, algorithm=consts.JWT_ALGORITHM)
    return encoded_jwt
