# -*- coding: utf_8 -*-

'''
请求方法：
OPTION : 用于获取资源支持的所有 HTTP 方法

HEAD : 用于只获取请求某个资源返回的头信息

GET : 用于从服务器获取资源信息
    完成请求后返回状态码 200 OK

POST : 用于创建新资源
    创建完成后返回状态码 201 Created

PUT : 用于完整的替换资源或者创建指定身份的资源
    如果是创建了资源，则返回 201 Created
    如果是替换了资源，则返回 200 OK

DELETE : 用于删除某个资源
    完成请求后返回状态码 204 No Content

PATCH : 用于局部更新资源
    完成请求后返回状态码 200 OK

================================================================================

状态码：
请求成功
    200：请求执行成功并返回相应数据
    201：创建成功并返回相应资源数据
    202：接受请求，但无法立即完成创建行为
    204：请求执行成功，不返回相应资源数据

重定向
    301：被请求的资源已永久移动到新位置
    302：请求的资源现在临时从不通的URI响应请求
    303：对应当前请求的响应可以在另一个 URI 上被找到，客户端应该使用 GET 方法进行请求
    307：对应当前请求的响应可以在另一个 URI 上被找到，客户端应该保持原有的请求方法进行请求

条件请求
    304：资源自从上次请求后没有再次发生变化，主要使用场景在于实现数据缓存
    409：请求操作和资源的当前状态存在冲突。主要使用场景在于实现并发控制
    412：服务器在验证请求的头字段中给出先决条件时，没能满足其中的一个或多个。主要使用场景在于实现并发控制

客户端错误
    400 : 请求体包含语法错误
    401 : 需要验证用户身份
    403 : 服务器拒绝执行
    404 : 找不到目标资源
    405 : 不允许执行目标方法，响应中应该带有 Allow 头，内容为对该资源有效的 HTTP 方法
    406 : 服务器不支持客户端请求的内容格式
    410 : 被请求的资源已被删除
    413 : POST 或者 PUT 请求的消息实体过大
    415 : 服务器不支持请求中提交的数据的格式
    422 : 请求格式正确，但是由于含有语义错误，无法响应
    428 : 要求先决条件，如果想要请求能成功必须满足一些预设的条件要求先决条件

服务端错误
    500 : 服务器遇到了一个未曾预料的状况，导致了它无法完成对请求的处理
    502 : 作为网关或者代理工作的服务器尝试执行请求时，从上游服务器接收到无效的响应
    501 : 服务器不支持当前请求所需要的某个功能
    503 : 由于临时的服务器维护或者过载，服务器当前无法处理请求

'''

class ResponseCode(object):
    # 通用状态码
    HTTP_SUCCESS = (200, "success")
    HTTP_NO_DATA = (204, "no data")
    HTTP_NO_CHANGE = (304, 'nothing change')
    HTTP_AUTH_FAIL = (401, 'authentication failed')
    HTTP_INVAILD_REQUEST = (403, 'invaild request')
    HTTP_NOT_FOUND = (404, "not found")
    HTTP_SERVER_ERROR = (500, "server error")


    # 用户模块
    USER_NOT_EXISTS = (1010001, 'user not exists')
    USER_EXISTS = (1010002, 'user already exists')
    USER_PASSWORD_ERROR = (1010003, 'password error')


def response_result(response, msg=None, data=None, **kwargs):
    c, m = response
    if msg == None:
        msg = m

    result = { 'code': c, 'msg': msg, 'data': data }
    result.update(kwargs)
    return result
