package hr.com.port.ips.eracun.gui;

import hr.com.port.gui.customControl.IpsTextField;
import hr.com.port.ips.eracun.provider.mer.enums.MerRejectionReasonType;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Modality;
import javafx.stage.Stage;


public final class RejectDialog {

    public static class Result {
			public final MerRejectionReasonType reasonType;
			public final String description;
			private Result(MerRejectionReasonType rt, String desc) { this.reasonType = rt; this.description = desc; }
		}

		// Vrati null ako je korisnik odustao.
		public static Result show(Stage owner) {
		final Stage stage = new Stage();
		stage.initOwner(owner);
		stage.initModality(Modality.WINDOW_MODAL);
		stage.setTitle("Odbij ulazni eRačun");

		Label lblReason = new Label("Razlog odbijanja:");
		IpsTextField txtReason = new IpsTextField();		
		txtReason.initForEnum();
		txtReason.clear();
		txtReason.setEnumEntries(MerRejectionReasonType.class, t -> t.getNaziv() + " (" + t.getCode() + ")");
		txtReason.setText(String.valueOf(MerRejectionReasonType.O.getNaziv() + " (" + MerRejectionReasonType.O.getCode() + ")"));
		txtReason.setBindValue(String.valueOf(MerRejectionReasonType.O.getId()));

		Label lblDesc = new Label("Opis:");
		TextArea txtDesc = new TextArea();
		txtDesc.setPromptText("Unesite opis razloga odbijanja...");
		txtDesc.setPrefRowCount(5);

		Button btnOk = new Button("Potvrdi");
		Button btnCancel = new Button("Odustani");

		GridPane grid = new GridPane();
		grid.setHgap(8);
		grid.setVgap(8);
		grid.add(lblReason, 0, 0);
		grid.add(txtReason, 1, 0);
		grid.add(lblDesc,   0, 1);
		grid.add(txtDesc,   1, 1);

		HBox buttons = new HBox(8, btnOk, btnCancel);
		VBox root = new VBox(10, grid, buttons);
		root.setPadding(new Insets(12));

		Scene scene = new Scene(root, 520, 260);

		// TODO ovdje primijeniti style kao što je kod owner-a		

		stage.setScene(scene);

		// (opcionalno) kopiraj ikone i centriraj nad ownerom
		try { stage.getIcons().setAll(owner.getIcons()); } catch (Exception ignore) {}
		if (owner != null) {
			stage.setX(owner.getX() + (owner.getWidth()  - scene.getWidth())  / 2);
			stage.setY(owner.getY() + (owner.getHeight() - scene.getHeight()) / 2);
		}

		final Result[] result = new Result[1];

		btnOk.setDefaultButton(true);
		btnOk.setOnAction(e -> {
			int id = txtReason.getBindInt(-1);
			if (id == -1) {
				new Alert(Alert.AlertType.WARNING,
						"Obavezno odabrati razlog odbijanja.",
						ButtonType.OK).showAndWait();
				return;
			}
			MerRejectionReasonType rt = MerRejectionReasonType.fromId(id);
			
			String desc = (txtDesc.getText() == null || txtDesc.getText().length()<1) ? rt.getNaziv() : txtDesc.getText().trim();
			result[0] = new Result(rt, desc);
			stage.close();
		});

		btnCancel.setCancelButton(true);
		btnCancel.setOnAction(e -> { result[0] = null; stage.close(); });

		stage.showAndWait();
		return result[0];
	}
}