# @Time   : 2022-03-03 17:00:00
# @Author : Gavin Jiang
# @Owner  : YSRD (Insights Value)

import os
import uuid

from flask import request, g

from framework.the_path import ThePath


class ApiUtil:

    @staticmethod
    def tmp_save_req_files(allowed_mimetypes=None, clear_after_request=True):
        """
        把本次请求中上传的文件存到临时目录中
        @param allowed_mimetypes:
        允许上传的mimetype,可在api/framework/constant/mimetype.py中找到定义好的值,如果为None,则所有类型的文件都将被保存到临时目录中
        @param clear_after_request:
        是否在请求结束后自动删除临时文件,True表示删除
        @return:
        返回一个列表,列表中以dict的方式返回每个上传文件的:
        1. 原始名称(filename)
        2. 临时文件名(tmp_filename)
        3. 临时文件路径(tmp_file_path)
        4. 文件大小(size)
        """
        results = []

        if not request.files:
            return results

        file_path = ThePath.tmp('post_files')

        file_storage_list = request.files
        for key in file_storage_list.keys():
            for file_storage in file_storage_list.getlist(key):
                filename = file_storage.filename
                mimetype = file_storage.mimetype

                if allowed_mimetypes and mimetype not in allowed_mimetypes:
                    continue

                tmp_filename = str(uuid.uuid4())
                tmp_file_path = os.path.join(file_path, tmp_filename).replace('\\', '/')
                file_storage.save(tmp_file_path)

                results.append({
                    'filename': filename,
                    'tmp_filename': tmp_filename,
                    'tmp_file_path': tmp_file_path,
                    'size': os.path.getsize(tmp_file_path),
                    'clear_after_request': clear_after_request
                })

        g.upload_tmp_files = results

        return results

    @staticmethod
    def get_raw_file_storage_list(allowed_mimetypes=None):
        """
        获取本次请求中上传文件的原始FileStorage列表
        @param allowed_mimetypes: 允许上传的mimetype,可在api/framework/constant/mimetype.py中找到定义好的值
        @return: 上传文件的原始FileStorage列表
        """
        results = []
        if not request.files:
            return results

        file_storage_list = request.files
        for key in file_storage_list.keys():
            for file_storage in file_storage_list.getlist(key):
                mimetype = file_storage.mimetype

                if allowed_mimetypes and mimetype not in allowed_mimetypes:
                    continue

                results.append(file_storage)

        return results

    @staticmethod
    def keep_decimals(line, fields,number=2):
        print(line)
        for i in fields:
            line[i] = round(line[i], number)
        return line