import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.Initializable;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

import java.net.URL;
import java.sql.*;
import java.util.List;
import java.util.ResourceBundle;

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        Connection conn=connectMySql();//连接数据库
        ObservableList<person> list= FXCollections.observableArrayList();
        TableView tableView=new TableView<>();
        tableView.setItems(list);//绑定
        initialize(conn,list);
        HBox firstLine=new HBox();
        firstLine.setSpacing(10);
        Label 首页标题标签=new Label("标题:");
        TextField 首页标题=new TextField();
        Label 分别标签=new Label("分别:");
        TextField 分别=new TextField();
        Button 查找=new Button("查找");
        tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
        查找.setOnAction(event -> {
            List<person> newlist=FXCollections.observableArrayList();
            tableView.getSelectionModel().clearSelection();
            boolean direct=false;
            for(int i=0;i<list.size();i++)
            {
                System.out.println(0);
                if(list.get(i).get标题().equals(首页标题.getText())&&list.get(i).get分类().equals(分别.getText()))
                {
                    tableView.getSelectionModel().select(i);
                    direct=true;
                    newlist.add(list.get(i));
                }
            }
            if(!direct)
            {
                System.out.println(首页标题.getText()+" "+分别.getText());
                if(分别.getLength()>0&&首页标题.getLength()>0)
                {
                    System.out.println(1);
                    for(int i=0;i<list.size();i++)
                    {
                        if (list.get(i).get标题().contains(首页标题.getText()) || list.get(i).get分类().equals(分别.getText()))
                        {
                            tableView.getSelectionModel().select(i);
                            newlist.add(list.get(i));
                        }
                    }
                }
                else if(分别.getLength()>0)
                {
                    System.out.println(2);
                    for(int i=0;i<list.size();i++)
                    {
                        if (list.get(i).get分类().contains(分别.getText()))
                        {
                            tableView.getSelectionModel().select(i);
                            System.out.println("!"+分别.getText()+" "+list.get(i).get分类());
                            newlist.add(list.get(i));
                        }
                    }
                }
                else if(首页标题.getLength()>0)
                {
                    System.out.println(3);
                    for(int i=0;i<list.size();i++)
                    {
                        if (list.get(i).get标题().contains(首页标题.getText()))
                        {
                            tableView.getSelectionModel().select(i);
                            newlist.add(list.get(i));
                        }
                    }
                }

            }
            list.clear();
            for(int i=0;i<newlist.size();i++)
            {
                list.add(newlist.get(i));
            }
        });
        Button 重置签到状态=new Button("重置签到状态");
        重置签到状态.setOnAction(event -> {
            String Sql="UPDATE Book SET `已完成`=''";
            Statement statement= null;
            try {
                statement = conn.createStatement();
                statement.execute(Sql);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            for(int i=0;i<list.size();i++)list.get(i).set已完成("");
        });
        Button 清除查找=new Button("清除查找");
        清除查找.setOnAction(event -> {
            String Sql="select * from Book";
            PreparedStatement psmt= null;
            list.clear();
            try {
                psmt = conn.prepareStatement(Sql);
                ResultSet rs=psmt.executeQuery();
                while(rs.next())
                {
                    list.add(new person(rs.getString("标题"),rs.getString("内容"),rs.getString("开始时间"),rs.getString("截止时间"),rs.getString("分类"),rs.getString("重要程度"),rs.getString("已完成")));
                }
                rs.close();
                psmt.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        });
        firstLine.getChildren().addAll(首页标题标签,首页标题,分别标签,分别,查找,重置签到状态,清除查找);
        HBox secondLine=new HBox();
        Button 新增=new Button("新增");
        新增.setOnAction(event -> {
            VBox vBox=new VBox();
            HBox 标题列=new HBox();
            Label 标题标签=new Label("标题:");
            TextField 标题=new TextField();
            标题列.getChildren().addAll(标题标签,标题);
            HBox 内容列=new HBox();
            Label 内容标签=new Label("内容:");
            TextField 内容=new TextField();
            内容列.getChildren().addAll(内容标签,内容);
            HBox 开始列=new HBox();
            Label 开始标签=new Label("开始时间;");
            TextField 开始时间=new TextField();
            开始列.getChildren().addAll(开始标签,开始时间);
            HBox 截至列=new HBox();
            Label 截至标签=new Label("截至时间:");
            TextField 截止时间=new TextField();
            截至列.getChildren().addAll(截至标签,截止时间);
            HBox 分类列=new HBox();
            Label 分类标签=new Label("分类:");
            TextField 分类=new TextField();
            分类列.getChildren().addAll(分类标签,分类);
            HBox 重要程度列=new HBox();
            Label 重要程度标签=new Label("重要程度:");
            TextField 重要程度=new TextField();
            重要程度列.getChildren().addAll(重要程度标签,重要程度);
            ToggleGroup toggleGroup=new ToggleGroup();
            Label 是否完成=new Label("是否完成");
            Label 是的标签=new Label("已完成");
            RadioButton 是=new RadioButton();
            是.setToggleGroup(toggleGroup);
            Label 不是的标签=new Label("未完成");
            RadioButton 否=new RadioButton();
            否.setToggleGroup(toggleGroup);
            HBox 是单元=new HBox();
            是单元.getChildren().addAll(是的标签,是);
            HBox 否单元=new HBox();
            否单元.getChildren().addAll(不是的标签,否);
            HBox 选择单元=new HBox();
            选择单元.setSpacing(10);
            选择单元.getChildren().addAll(是否完成,是单元,否单元);
            HBox 是否结束=new HBox();
            Button 完成=new Button("完成");
            是否结束.getChildren().addAll(完成);
            vBox.getChildren().addAll(标题列,内容列,开始列,截至列,分类列,重要程度列,选择单元,是否结束);
            vBox.setAlignment(Pos.CENTER);
            BorderPane borderPane=new BorderPane();
            borderPane.setCenter(vBox);
            borderPane.setPadding(new Insets(20));
            Scene scene=new Scene(borderPane);
            Stage stage=new Stage();
            stage.setScene(scene);
            stage.show();
            stage.setTitle("新增");
            完成.setOnAction(event1 -> {
                String 是否完成转化="";
                if(是.isSelected())是否完成转化="已完成";
                else 是否完成转化="未完成";
                try {
                    addMySql(标题.getText(),内容.getText(),开始时间.getText(),截止时间.getText(),分类.getText(),重要程度.getText(),是否完成转化,list,conn);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                stage.close();
            });
        });
        Button 修改=new Button("修改");
        修改.setOnAction(event -> {
            String 原来的col="";
            int index1=tableView.getSelectionModel().getFocusedIndex();
            VBox vBox=new VBox();
            HBox 标题列=new HBox();
            Label 标题标签=new Label("标题:       ");
            TextField 标题=new TextField();
            标题.setText(list.get(index1).get标题());
            标题列.getChildren().addAll(标题标签,标题);
            HBox 内容列=new HBox();
            Label 内容标签=new Label("内容:       ");
            TextField 内容=new TextField();
            内容.setText(list.get(index1).get内容());
            内容列.getChildren().addAll(内容标签,内容);
            HBox 开始列=new HBox();
            Label 开始标签=new Label("开始时间:");
            TextField 开始时间=new TextField();
            开始时间.setText(list.get(index1).get开始());
            开始列.getChildren().addAll(开始标签,开始时间);
            HBox 截至列=new HBox();
            Label 截至标签=new Label("截至时间:");
            TextField 截止时间=new TextField();
            截止时间.setText(list.get(index1).get结束());
            截至列.getChildren().addAll(截至标签,截止时间);
            HBox 分类列=new HBox();
            Label 分类标签=new Label("分类:       ");
            TextField 分类=new TextField();
            分类.setText(list.get(index1).get分类());
            分类列.getChildren().addAll(分类标签,分类);
            HBox 重要程度列=new HBox();
            Label 重要程度标签=new Label("重要程度:");
            TextField 重要程度=new TextField();
            重要程度.setText(list.get(index1).get重要());
            重要程度列.getChildren().addAll(重要程度标签,重要程度);
            ToggleGroup toggleGroup=new ToggleGroup();
            Label 是否完成=new Label("是否完成:");
            Label 是的标签=new Label("已完成");
            RadioButton 是=new RadioButton();
            是.setToggleGroup(toggleGroup);
            Label 不是的标签=new Label("未完成");
            RadioButton 否=new RadioButton();
            否.setToggleGroup(toggleGroup);
            if(list.get(index1).get已完成().equals("已完成"))
            {
                是.setSelected(true);
            }
            else
            {
                否.setSelected(true);;
            }
            HBox 是单元=new HBox();
            是单元.getChildren().addAll(是的标签,是);
            HBox 否单元=new HBox();
            否单元.getChildren().addAll(不是的标签,否);
            HBox 选择单元=new HBox();
            选择单元.setSpacing(10);
            选择单元.getChildren().addAll(是否完成,是单元,否单元);
            HBox 是否结束=new HBox();
            Button 完成=new Button("完成");

            是否结束.getChildren().addAll(完成);
            vBox.getChildren().addAll(标题列,内容列,开始列,截至列,分类列,重要程度列,选择单元,是否结束);
            vBox.setAlignment(Pos.CENTER);
            BorderPane borderPane=new BorderPane();
            borderPane.setCenter(vBox);
            borderPane.setPadding(new Insets(20));
            Scene scene=new Scene(borderPane);
            Stage stage=new Stage();
            stage.setScene(scene);
            stage.setTitle("修改");
            stage.show();
            完成.setOnAction(event1 -> {
                String 是否完成转化="";
                if(是.isSelected())是否完成转化="已完成";
                else 是否完成转化="未完成";
                int index=tableView.getSelectionModel().getFocusedIndex();
                String title=list.get(index).get标题();
                String include=list.get(index).get分类();
                String Sql="UPDATE Book ";
//                UPDATE Book SET `标题`='a',`内容`='a' WHERE `标题`='A'
                String set="SET`标题`="+"'"+标题.getText()+"'"+",`内容`="+"'"+内容.getText()+"'"+",`开始时间`="+"'"+开始时间.getText()+"'"+",`截止时间`="+"'"+截止时间.getText()+"'"+",`分类`="+"'"+分类.getText()+"'"+",`重要程度`="+"'"+重要程度.getText()+"'"+",`已完成`="+"'"+是否完成转化+"'\n";
                String find="WHERE "+"`标题`="+"'"+title+"'"+"AND `分类`="+"'"+include+"'";
                Sql+=set;
                Sql+=find;
                System.out.println(Sql);
                Statement statement= null;
                try {
                    statement = conn.createStatement();
                    statement.execute(Sql);
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
                list.get(index).set已完成(是否完成转化);
                list.get(index).set标题(标题.getText());
                list.get(index).set内容(内容.getText());
                list.get(index).set开始(开始时间.getText());
                list.get(index).set结束(截止时间.getText());
                list.get(index).set分类(分类.getText());
                list.get(index).set重要(重要程度.getText());
                stage.close();
            });
        });
        Button 删除=new Button("删除");
        删除.setOnAction(event -> {

            int index=tableView.getSelectionModel().getFocusedIndex();
            String title=list.get(index).get标题();
            String include=list.get(index).get内容();
            //sql上主键自增只能从1
            String Sql="DELETE FROM Book WHERE "+"标题="+"'"+title+"'";
            try {
                Statement statement=conn.createStatement();
                statement.execute(Sql);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            list.remove(index);
        });
        Button 标记为完成=new Button("标记为完成");
        标记为完成.setOnAction(event -> {
            int index=tableView.getSelectionModel().getFocusedIndex();
            String title=list.get(index).get标题();
            String include=list.get(index).get内容();
            String Sql="UPDATE Book SET `已完成`='已完成' WHERE `标题`="+"'"+title+"'"+"AND"+"`内容`="+"'"+include+"'";
            System.out.println(Sql);
            list.get(index).set已完成("已完成");
            try {
                Statement statement=conn.createStatement();
                statement.execute(Sql);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        });
        Button 标记为待办=new Button("标记为待办");
        标记为待办.setOnAction(event -> {
            int index=tableView.getSelectionModel().getFocusedIndex();
            String title=list.get(index).get标题();
            String include=list.get(index).get内容();
            String Sql="UPDATE Book SET `已完成`='未完成' WHERE `标题`="+"'"+title+"'"+"AND"+"`内容`="+"'"+include+"'";
            System.out.println(Sql);
            list.get(index).set已完成("未完成");
            try {
                Statement statement=conn.createStatement();
                statement.execute(Sql);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        });
        secondLine.getChildren().addAll(新增,修改,删除,标记为完成,标记为待办);
        secondLine.setSpacing(30);
        HBox thirdLine=new HBox();
        TableColumn<person,String> 标题=new TableColumn<>("标题");
        标题.setCellValueFactory(cellData->cellData.getValue().标题Property());
        TableColumn<person,String> 分类=new TableColumn<>("分类");
        分类.setCellValueFactory(cellData->cellData.getValue().分类Property());
        TableColumn<person,String> 重要=new TableColumn<>("重要");
        重要.setCellValueFactory(cellData->cellData.getValue().重要Property());
        TableColumn<person,String> 开始=new TableColumn<>("开始");
        开始.setCellValueFactory(cellData->cellData.getValue().开始Property());
        TableColumn<person,String> 结束=new TableColumn<>("结束");
        结束.setCellValueFactory(cellData->cellData.getValue().结束Property());
        TableColumn<person,String> 已完成=new TableColumn<>("已完成");
        已完成.setCellValueFactory(cellData->cellData.getValue().已完成Property());
        TableColumn<person,String> 内容=new TableColumn<>("内容");
        内容.setPrefWidth(200);
        内容.setCellValueFactory(cellData->cellData.getValue().内容Property());
        tableView.getColumns().addAll(标题,分类,重要,开始,结束,已完成,内容);
        //映射
        TextField 版权 = new TextField("版权所有© 内蒙古农业大学 王泽斌");
        版权.setEditable(false);
        版权.setAlignment(Pos.CENTER);
        VBox pane=new VBox(firstLine,secondLine,thirdLine,tableView,版权);
        BorderPane borderPane=new BorderPane();
        borderPane.setCenter(pane);
        pane.setSpacing(5);
        borderPane.setPadding(new Insets(20));
        Scene scene=new Scene(borderPane,800,500);
        primaryStage.setTitle("内蒙古农业大学X待办事项");
        primaryStage.setScene(scene);
        borderPane.setStyle("-fx-border-width:2px;-fx-border-color:black");
        primaryStage.setResizable(false);
        primaryStage.show();
    }
    public Connection connectMySql() throws Exception
    {
        String username="root";
        String password="";
        String connectionUrl = "jdbc:mysql://bj-cynosdbmysql-grp-你的SQL地址/Library?useUnicode=true&characterEncoding=UTF-8";
        Connection conn= DriverManager.getConnection(connectionUrl,username,password);
        return conn;
    }
    public void addMySql(String 标题,String 内容,String 开始时间,String 截止时间,String 分类,String 重要程度,String 已完成,ObservableList<person> list,Connection conn) throws Exception
    {
        list.add(new person(标题,内容,开始时间,截止时间,分类,重要程度,已完成));
        //sql
        String Value="VALUES ('"+标题+"', '"+内容+"','"+内容+"','"+截止时间+"','"+分类+"','"+重要程度+"','"+已完成+"') ";
        String Sql="INSERT INTO Book(`标题`, `内容`, `开始时间`, `截止时间`, `分类`, `重要程度`, `已完成`)"+Value;//合并成一句
        Statement statement=conn.createStatement();
        statement.execute(Sql,Statement.RETURN_GENERATED_KEYS);
    }
    public static void main(String[] args) {
        launch();
    }

    public void initialize(Connection conn,ObservableList<person> list) throws Exception
    {
        String Sql="select * from Book";
        PreparedStatement psmt=conn.prepareStatement(Sql);
        ResultSet rs=psmt.executeQuery();
        while(rs.next())
        {
            list.add(new person(rs.getString("标题"),rs.getString("内容"),rs.getString("开始时间"),rs.getString("截止时间"),rs.getString("分类"),rs.getString("重要程度"),rs.getString("已完成")));
        }
        rs.close();
        psmt.close();
    }
}
class person{
    SimpleStringProperty 标题=new SimpleStringProperty();
    SimpleStringProperty 分类=new SimpleStringProperty();
    SimpleStringProperty 重要=new SimpleStringProperty();
    SimpleStringProperty 开始=new SimpleStringProperty();
    SimpleStringProperty 结束=new SimpleStringProperty();
    SimpleStringProperty 已完成=new SimpleStringProperty();
    SimpleStringProperty 内容=new SimpleStringProperty();
    public person(String 标题,String 内容,String 开始时间,String 截止时间,String 分类,String 重要程度,String 已完成)
    {
        set标题(标题);
        set分类(分类);
        set开始(开始时间);
        set结束(截止时间);
        set分类(分类);
        set重要(重要程度);
        set已完成(已完成);
        set内容(内容);
    }
    public SimpleStringProperty 标题Property() {
        return 标题;
    }

    public SimpleStringProperty 分类Property() {
        return 分类;
    }

    public SimpleStringProperty 重要Property() {
        return 重要;
    }

    public SimpleStringProperty 开始Property() {
        return 开始;
    }

    public SimpleStringProperty 结束Property() {
        return 结束;
    }

    public SimpleStringProperty 已完成Property() {
        return 已完成;
    }

    public SimpleStringProperty 内容Property() {
        return 内容;
    }

    public void set标题(String 标题) {
        this.标题.set(标题);
    }

    public void set分类(String 分类) {
        this.分类.set(分类);
    }

    public void set重要(String 重要) {
        this.重要.set(重要);
    }

    public void set开始(String 开始) {
        this.开始.set(开始);
    }

    public void set结束(String 结束) {
        this.结束.set(结束);
    }

    public void set已完成(String 已完成) {
        this.已完成.set(已完成);
    }

    public void set内容(String 内容) {
        this.内容.set(内容);
    }

    public String get标题() {
        return 标题.get();
    }

    public String get分类() {
        return 分类.get();
    }

    public String get重要() {
        return 重要.get();
    }

    public String get开始() {
        return 开始.get();
    }

    public String get结束() {
        return 结束.get();
    }

    public String get已完成() {
        return 已完成.get();
    }

    public String get内容() {
        return 内容.get();
    }
}