'''

数据源管理模块api

'''

from flask import jsonify, request

from flask import Blueprint

from utils.auth import validate_user, validate_permissions

from utils.web_utils import get_req_para, validate_params, generate_download_file

from utils.common_utils import gen_json_response

from utils.validate_utils import validate_json

from web_apps.datasource.services.datasource_api_services import DataSourceApiService

datasource_bp = Blueprint('datasource', __name__)

    



@datasource_bp.route('/list', methods=['GET'])

@validate_user

@validate_permissions([])

def datasource_list():

    '''

    列表查询接口

    '''

    req_dict = get_req_para(request)

    verify_dict = {

    }

    not_valid = validate_params(req_dict, verify_dict)

    if not_valid:

        return jsonify(gen_json_response(code=400, msg=not_valid))

    res_data = DataSourceApiService().get_obj_list(req_dict)

    return jsonify(res_data)

    



@datasource_bp.route('/queryAllList', methods=['GET'])

@validate_user

@validate_permissions([])

def datasource_all_list():

    '''

    全量列表查询接口

    '''

    req_dict = get_req_para(request)

    verify_dict = {

    }

    not_valid = validate_params(req_dict, verify_dict)

    if not_valid:

        return jsonify(gen_json_response(code=400, msg=not_valid))

    res_data = DataSourceApiService().get_obj_all_list(req_dict)

    return jsonify(res_data)

    



@datasource_bp.route('/queryById', methods=['GET'])

@validate_user

@validate_permissions([])

def datasource_detail():

    '''

    详情

    '''

    req_dict = get_req_para(request)

    verify_dict = {

        "id": {

            "name": "id",

            "required": True

        }

    }

    not_valid = validate_params(req_dict, verify_dict)

    if not_valid:

        return jsonify(gen_json_response(code=400, msg=not_valid))

    res_data = DataSourceApiService().get_obj_detail(req_dict)

    return jsonify(res_data)

    



@datasource_bp.route('/add', methods=['POST'])

@validate_user

@validate_permissions(['datasource:add'])

def datasource_add():

    '''

    添加

    '''

    req_dict = get_req_para(request)

    verify_dict = {

        "name": {

            "name": "名称",

            "required": True

        },

        "type": {

            "name": "类型",

            "required": True

        },

         "conn_conf": {

            "name": "连接配置",

            "funcs": [validate_json]

        },

        "ext_params": {

            "name": "额外参数",

            "funcs": [validate_json]

        }

    }

    not_valid = validate_params(req_dict, verify_dict)

    if not_valid:

        return jsonify(gen_json_response(code=400, msg=not_valid))

    res_data = DataSourceApiService().add_obj(req_dict)

    return jsonify(res_data)

    



@datasource_bp.route('/edit', methods=['POST', 'PUT'])

@validate_user

@validate_permissions(['datasource:edit'])

def datasource_edit():

    '''

    编辑

    '''

    req_dict = get_req_para(request)

    verify_dict = {

        "id": {

            "name": "id",

            "required": True

        },

        "name": {

            "name": "名称",

            "required": True

        },

        "type": {

            "name": "类型",

            "required": True

        },

        "conn_conf": {

            "name": "连接配置",

            "funcs": [validate_json]

        },

        "ext_params": {

            "name": "额外参数",

            "funcs": [validate_json]

        }

    }

    not_valid = validate_params(req_dict, verify_dict)

    if not_valid:

        return jsonify(gen_json_response(code=400, msg=not_valid))

    res_data = DataSourceApiService().edit_obj(req_dict)

    return jsonify(res_data)

    



@datasource_bp.route('/delete', methods=['POST', 'DELETE'])

@validate_user

@validate_permissions(['datasource:delete'])

def datasource_delete():

    '''

    删除

    '''

    req_dict = get_req_para(request)

    verify_dict = {

        "id": {

            "name": "id",

            "required": True

        }

    }

    not_valid = validate_params(req_dict, verify_dict)

    if not_valid:

        return jsonify(gen_json_response(code=400, msg=not_valid))

    res_data = DataSourceApiService().delete_obj(req_dict)

    return jsonify(res_data)

    



@datasource_bp.route('/deleteBatch', methods=['POST', 'DELETE'])

@validate_user

@validate_permissions(['datasource:delete'])

def datasource_deleteBatch():

    '''

    批量删除

    '''

    req_dict = get_req_para(request)

    verify_dict = {

        "ids": {

            "name": "id列表",

            "required": True

        }

    }

    not_valid = validate_params(req_dict, verify_dict)

    if not_valid:

        return jsonify(gen_json_response(code=400, msg=not_valid))

    res_data = DataSourceApiService().delete_batch(req_dict)

    return jsonify(res_data)

    



@datasource_bp.route('/importExcel', methods=['POST'])

@validate_user

@validate_permissions([])

def datasource_importExcel():

    '''

    excel导入

    '''

    file = request.files.get('file', '')

    if file == '':

        res_data = gen_json_response(code=400, msg='请上传文件')

    else:

        res_data = DataSourceApiService().importExcel(file)

    return jsonify(res_data)

    



@datasource_bp.route('/exportXls', methods=['GET'])

@validate_user

@validate_permissions([])

def datasource_exportXls():

    '''

    导出excel 

    '''

    req_dict = get_req_para(request)

    verify_dict = {

        "selections": {

            "name": "选择项",

            "required": True

        }

    }

    not_valid = validate_params(req_dict, verify_dict)

    if not_valid:

        return jsonify(gen_json_response(code=400, msg=not_valid))

    try:

        output_file = DataSourceApiService().exportXls(req_dict)

        return generate_download_file(output_file, 'output')

    except Exception as e:

        return jsonify(gen_json_response(code=500, msg=f"未知错误:{e}"))





@datasource_bp.route('/connect', methods=['POST'])

@validate_user

@validate_permissions([])

def datasource_connect():

    '''

    数据源连接测试

    '''

    req_dict = get_req_para(request)

    verify_dict = {

        "type": {

            "name": "数据源类型",

            "required": True

        },

        "conn_conf": {

            "name": "连接配置",

            "funcs": [validate_json]

        }

    }

    not_valid = validate_params(req_dict, verify_dict)

    if not_valid:

        return jsonify(gen_json_response(code=400, msg=not_valid))

    res_data = DataSourceApiService().connTest(req_dict)

    return jsonify(res_data)





@datasource_bp.route('/sync_models', methods=['POST'])

@validate_user

@validate_permissions(['datasource:sync_models'])

def datasource_sync_models():

    '''

    数据源自动建模

    '''

    req_dict = get_req_para(request)

    verify_dict = {

        "datasource_id": {

            "name": "数据源id",

            "required": True

        }

    }

    not_valid = validate_params(req_dict, verify_dict)

    if not_valid:

        return jsonify(gen_json_response(code=400, msg=not_valid))

    res_data = DataSourceApiService().syncModels(req_dict)

    return jsonify(res_data)





@datasource_bp.route('/types', methods=['GET'])

@validate_user

@validate_permissions([])

def datasource_types():

    '''

    获取所有数据源类型

    '''

    req_dict = get_req_para(request)

    verify_dict = {

    }

    not_valid = validate_params(req_dict, verify_dict)

    if not_valid:

        return jsonify(gen_json_response(code=400, msg=not_valid))

    res_data = DataSourceApiService().get_datasource_types(req_dict)

    return jsonify(res_data)





@datasource_bp.route('/config/<datasource_type>', methods=['GET'])

@validate_user

@validate_permissions([])

def datasource_config(datasource_type):

    '''

    根据数据源类型获取连接配置表单

    '''

    req_dict = get_req_para(request)

    req_dict['type'] = datasource_type

    verify_dict = {

    }

    not_valid = validate_params(req_dict, verify_dict)

    if not_valid:

        return jsonify(gen_json_response(code=400, msg=not_valid))

    res_data = DataSourceApiService().get_datasource_config(req_dict)

    return jsonify(res_data)