##############################################################################
# Copyright (c) 2015 Orange
# guyrodrigue.koffi@orange.com / koffirodrigue@gmail.com
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################

from tornado import gen
from tornado import web

from opnfv_testapi.common import message
from opnfv_testapi.common import raises
from opnfv_testapi.db import api as dbapi
from opnfv_testapi.resources import models
from opnfv_testapi.ui.auth import base
from opnfv_testapi.ui.auth import constants as auth_const


class ProfileHandler(base.BaseHandler):
    def __init__(self, application, request, **kwargs):
        super(ProfileHandler, self).__init__(application, request, **kwargs)
        self.table_cls = User

    @web.asynchronous
    @gen.coroutine
    def get(self):
        openid = self.get_secure_cookie('openid')
        if openid:
            try:
                user = yield dbapi.db_find_one(self.table, {'openid': openid})
                self.finish_request({
                    "openid": user.get('openid'),
                    "email": user.get('email'),
                    "fullname": user.get('fullname'),
                    "role": user.get('role', 'user'),
                    "type": self.get_secure_cookie('signin_type'),
                    "companyName": user.get('companyName'),
                    "companyWebsite": user.get('companyWebsite'),
                    "primaryContactName": user.get('primaryContactName'),
                    "primaryBusinessEmail": user.get('primaryBusinessEmail'),
                    "primaryPostalAddress": user.get('primaryPostalAddress'),
                    "primaryPhoneNumber": user.get('primaryPhoneNumber')

                })
            except Exception:
                pass
        raises.Unauthorized('Unauthorized')

    @gen.coroutine
    def put(self):
        db_keys = []
        openid = self.get_secure_cookie(auth_const.OPENID)

        if openid:
            query = {'openid': openid}
            user = yield dbapi.db_find_one(self.table, query)
            if not user:
                raises.NotFound(message.not_found(self.table, query))

            self._update(query=query, db_keys=db_keys)
        else:
            raises.Unauthorized(message.no_auth())


class User(models.ModelBase):
    def __init__(self, _id=None, openid=None, email=None, fullname=None,
                 role='user', u_type=None, companyName=None,
                 companyWebsite=None, primaryContactName=None,
                 primaryBusinessEmail=None, primaryPostalAddress=None,
                 primaryPhoneNumber=None):
        self._id = _id
        self.openid = openid
        self.email = email
        self.fullname = fullname
        self.role = role
        self.type = u_type

        self.companyName = companyName
        self.companyWebsite = companyWebsite
        self.primaryContactName = primaryContactName
        self.primaryBusinessEmail = primaryBusinessEmail
        self.primaryPostalAddress = primaryPostalAddress
        self.primaryPhoneNumber = primaryPhoneNumber
