# -*- coding: utf-8 -*-
import FreeCAD
import FreeCADGui
import Part
from PySide import QtGui, QtCore

# ==================== DIALOG ====================
class CutDialog(QtGui.QDialog):
    def __init__(self):
        super(CutDialog, self).__init__()
        self.setWindowTitle("Vessel: split under / above waterline")
        self.setMinimumWidth(350)
        
        layout = QtGui.QFormLayout()
        
        # Tiefgang
        self.zInput = QtGui.QDoubleSpinBox()
        self.zInput.setRange(0.0, 50000.0)
        self.zInput.setValue(7500.0)
        self.zInput.setDecimals(2)
        self.zInput.setSuffix(" mm")
        layout.addRow("Draft / Z-Intersection (mm):", self.zInput)
        
        # Farbe Unterwasser
        self.colorUnder = QtGui.QPushButton("Choose color...")
        self.colorUnder.setStyleSheet("background-color: #BF261A; color: white;")
        self.rgbUnder = (0.75, 0.15, 0.10, 0.0)
        self.colorUnder.clicked.connect(lambda: self.pick_color("under"))
        layout.addRow("under waterline (Antifouling):", self.colorUnder)
        
        # Farbe Oberwasser
        self.colorOver = QtGui.QPushButton("choose color...")
        self.colorOver.setStyleSheet("background-color: #0D3F1F; color: white;")
        self.rgbOver = (0.05, 0.25, 0.12, 0.0)
        self.colorOver.clicked.connect(lambda: self.pick_color("over"))
        layout.addRow("above waterline (Racing Green):", self.colorOver)
        
        # Buttons
        btnBox = QtGui.QDialogButtonBox(
            QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel
        )
        btnBox.accepted.connect(self.accept)
        btnBox.rejected.connect(self.reject)
        layout.addRow(btnBox)
        
        self.setLayout(layout)
    
    def pick_color(self, which):
        color = QtGui.QColorDialog.getColor()
        if color.isValid():
            rgb = (color.redF(), color.greenF(), color.blueF(), 0.0)
            hex_color = color.name()
            if which == "under":
                self.rgbUnder = rgb
                self.colorUnder.setStyleSheet(
                    "background-color: {}; color: white;".format(hex_color)
                )
            else:
                self.rgbOver = rgb
                self.colorOver.setStyleSheet(
                    "background-color: {}; color: white;".format(hex_color)
                )

# ==================== HAUPTLOGIK ====================
def run_cut():
    doc = FreeCAD.ActiveDocument
    sel = FreeCADGui.Selection.getSelection()
    
    if not sel:
        QtGui.QMessageBox.warning(None, "Failure", "Please choose solid or shape in modell tree!")
        return
    
    obj = sel[0]
    if not hasattr(obj, "Shape"):
        QtGui.QMessageBox.warning(None, "Failure", "Choosen part is no solid or shape.")
        return
    
    # Dialog öffnen
    dialog = CutDialog()
    if dialog.exec_() != QtGui.QDialog.Accepted:
        FreeCAD.Console.PrintMessage("Abbruch durch Benutzer.\n")
        return
    
    Z_CUT = dialog.zInput.value()
    COLOR_UNTER = dialog.rgbUnder
    COLOR_OBER  = dialog.rgbOver
    MARGE = 5000.0
    
    shape = obj.Shape
    bb = shape.BoundBox
    
    FreeCAD.Console.PrintMessage("Intersection at Z = {} mm...\n".format(Z_CUT))
    
    # --- Hilfsboxen ---
    under_box = Part.makeBox(
        bb.XLength + 2*MARGE,
        bb.YLength + 2*MARGE,
        Z_CUT - bb.ZMin + MARGE,
        FreeCAD.Vector(bb.XMin - MARGE, bb.YMin - MARGE, bb.ZMin - MARGE)
    )
    
    over_box = Part.makeBox(
        bb.XLength + 2*MARGE,
        bb.YLength + 2*MARGE,
        bb.ZMax - Z_CUT + MARGE,
        FreeCAD.Vector(bb.XMin - MARGE, bb.YMin - MARGE, Z_CUT)
    )
    
    # --- Boolean Common ---
    under_shape = shape.common(under_box)
    over_shape  = shape.common(over_box)
    
    # --- Neue Objekte ---
    if under_shape.Volume > 0.0001:
        under = doc.addObject("Part::Feature", "under water hull")
        under.Shape = under_shape
        under.ViewObject.ShapeColor = COLOR_UNTER
        FreeCAD.Console.PrintMessage("create underwater: {:.3f} m³\n".format(under_shape.Volume/1e9))
    else:
        FreeCAD.Console.PrintWarning("under water: no volume.\n")
    
    if over_shape.Volume > 0.0001:
        over = doc.addObject("Part::Feature", "above waterline")
        over.Shape = over_shape
        over.ViewObject.ShapeColor = COLOR_OBER
        FreeCAD.Console.PrintMessage("create above waterline: {:.3f} m³\n".format(over_shape.Volume/1e9))
    else:
        FreeCAD.Console.PrintWarning("above waterline: no volume.\n")
    
    # Original ausblenden
    obj.ViewObject.Visibility = False
    doc.recompute()
    
    QtGui.QMessageBox.information(None, "Done", 
        "Zwei Solids erzeugt bei Z = {} mm.\nOriginal ausgeblendet.".format(Z_CUT))

# ==================== START ====================
run_cut()