package com.zhangmeng.online.exam.ui.api.model;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.zhangmeng.online.exam.ui.api.DataLoad;
import com.zhangmeng.online.exam.ui.api.form.UserForm;
import com.zhangmeng.online.exam.ui.controller.UserEditController;
import com.zhangmeng.online.exam.ui.module.Role;
import com.zhangmeng.online.exam.ui.module.User;
import com.zhangmeng.online.exam.ui.service.RoleService;
import com.zhangmeng.online.exam.ui.utils.AlertUtils;
import com.zhangmeng.online.exam.ui.utils.HttpUtils;
import javafx.beans.property.SimpleStringProperty;

import java.util.*;

import com.zhangmeng.online.exam.ui.utils.ApiUtils;
import javafx.collections.FXCollections;
import javafx.scene.Parent;
import javafx.scene.control.MenuItem;
import javafx.stage.Stage;

/**
 * @author zm
 * @date 2025/3/14 16:01
 * @version: 1.0
 */
public class UserDataLoad implements DataLoad {

    private Parent form;

    @Override
    public ApiUtils.DataView loadData(Integer pageNum, Integer pageSize) {
        Map<String, Object> params = new HashMap<>();
        params.put("pageNum", pageNum.toString());
        params.put("pageSize", pageSize.toString());
        String userListData = HttpUtils.GET(ApiUtils.API_URL + "/user/list", params);
        JSONObject jsonObject = JSON.parseObject(userListData);
        JSONArray data = jsonObject.getJSONArray("data");
        int total = jsonObject.getIntValue("total");
        List<Map<String, SimpleStringProperty>> userMapList = new ArrayList<>();
        for (Object datum : data) {
            JSONObject user = (JSONObject) datum;
            Map<String, SimpleStringProperty> userMap = new HashMap<>();
            userMap.put("序号", new SimpleStringProperty(user.getString("id")));
            userMap.put("用户名", new SimpleStringProperty(user.getString("username")));
            userMap.put("手机号码", new SimpleStringProperty(user.getString("phone")));
            userMap.put("电子邮箱", new SimpleStringProperty(user.getString("email")));

            userMap.put("用户名_username", new SimpleStringProperty(user.getString("username")));
            userMap.put("手机号码_phone", new SimpleStringProperty(user.getString("phone")));
            userMap.put("电子邮箱_email", new SimpleStringProperty(user.getString("email")));

            userMap.put("id", new SimpleStringProperty(user.getString("id")));
            userMapList.add(userMap);
        }

        ApiUtils.DataView dataView = new ApiUtils.DataView(Arrays.asList("序号", "用户名", "手机号码", "电子邮箱"), userMapList).setDataLoad(this).setPageNum(pageNum).setPageSize(pageSize).setTotal(total);
        dataView.setDataLoad(this);
        return dataView;
    }

    @Override
    public void setForm(Parent view) {
        this.form = view;
    }

    @Override
    public Parent getForm() {
        return this.form;
    }

    @Override
    public Map<String, Object> saveForm(Map<String, Object> map) {
        String result = HttpUtils.POST(ApiUtils.API_URL + "/user/save", map);
        JSONObject jsonObject = JSON.parseObject(result);
        if (jsonObject.getIntValue("code") == 200) {
            AlertUtils.alert_msg("保存成功！");
        } else {
            AlertUtils.alert_warning("保存失败！");
        }
        return null;
    }

    @Override
    public void deleteData(String id) {
        Map<String, Object> map = new HashMap<>();
        map.put("id", id);
        String result = HttpUtils.POST(ApiUtils.API_URL + "/user/delete", map);
        JSONObject jsonObject = JSON.parseObject(result);
        if (jsonObject.getIntValue("code") == 200) {
            AlertUtils.alert_msg("删除成功！");
        } else {
            AlertUtils.alert_warning("删除失败！");
        }
    }

    @Override
    public void editData(String id, Stage stage) {

        UserForm userForm = new UserForm();
        UserEditController controller = userForm.getController();

        Map<String, Object> map = new HashMap<>();
        map.put("id", id);
        String result = HttpUtils.GET(ApiUtils.API_URL + "/user/getUser", map);
        JSONObject jsonObject = JSON.parseObject(result);
        JSONObject data = jsonObject.getJSONObject("data");
        String username = data.getString("username");
        controller.usernameField.setText(username);
        String email = data.getString("email");
        controller.emailField.setText(email);
        String phone = data.getString("phone");
        controller.phoneField.setText(phone);
        String password = data.getString("password");
        String role_ids = data.getString("role_ids");
        List<Role> roles = new ArrayList<>();
        List<Role> allRoles = RoleService.getAllRoles();
        User user = new User();
        user.setId(Integer.parseInt(id));
        user.setUsername(username);
        user.setEmail(email);
        user.setPhone(phone);
        user.setPassword(password);
        if (role_ids != null && !role_ids.equals("null")) {
            String[] role_id_arr = role_ids.split(",");
            for (Role allRole : allRoles) {
                Role role = new Role();
                role.setId(allRole.getId());
                role.setSelected(false);
                for (String role_id : role_id_arr) {
                    if (allRole.getId() == Integer.parseInt(role_id)) {
                        role.setSelected(true);
                        user.getRoles().add(role);
                        break;
                    }
                }
                role.setName(allRole.getName());
                role.setDescription(allRole.getDescription());
                role.setStatus(allRole.getStatus());
                role.setPermissions(allRole.getPermissions());
                roles.add(role);
            }
        }

        controller.passwordField.setText(password);
        controller.roleListView.setItems(FXCollections.observableArrayList(roles));

        controller.setUser(user);
        AlertUtils.alert("编辑用户信息", (Parent) userForm, stage);
    }

    @Override
    public void updateData(String id, String name, String oldValue, String newValue) {
//        System.out.println("修改前：" + oldValue + "，修改后：" + newValue);

        Map<String, Object> map = new HashMap<>();
        map.put("id", id);
        map.put("fieldName", name);
        map.put("oldValue", oldValue);
        map.put("newValue", newValue);
        String result = HttpUtils.POST(ApiUtils.API_URL + "/user/update", map);
        JSONObject jsonObject = JSON.parseObject(result);
        if (jsonObject.getIntValue("code") == 200) {
            AlertUtils.alert_msg("更新成功！");
        } else {
            AlertUtils.alert_warning("更新失败！");
        }

    }


    @Override
    public List<MenuItem> getContextMenu() {


        return null;
    }

    @Override
    public ApiUtils.DataView searchData(Map<String, Object> searchText, int pageNum, int pageSize) {
        return null;
    }
}
