### BEGIN GPL LICENSE BLOCK #####
#
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU General Public License
#  as published by the Free Software Foundation; either version 3
#  of the License, or (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# ##### END GPL LICENSE BLOCK #####
import bpy

from bpy.props import (
    EnumProperty,
    StringProperty,
    BoolProperty,
    IntProperty,
    FloatVectorProperty,
    FloatProperty,
    )

from bpy.app.translations import contexts as i18n_contexts

import rna_keymap_ui


class SnapUtilitiesPreferences(bpy.types.AddonPreferences):
    # this must match the addon name, use '__package__'
    # when defining this in a submodule of a python package.
    bl_idname = __package__

    intersect : BoolProperty(name="Intersect",
        description="intersects created line with the existing edges, even if the lines do not intersect",
        default=True)

    create_face : BoolProperty(name="Create faces",
        description="Create faces defined by enclosed edges",
        default=False)

    outer_verts : BoolProperty(name="Snap to outer vertices",
        description="The vertices of the objects are not activated also snapped",
        default=True)

    increments_grid : BoolProperty(name="Increments of Grid",
        description="Snap to increments of grid",
        default=False)

    auto_constrain : BoolProperty(name="Automatic Constraint",
        description="Detects a direction to constrain depending on the position of the mouse.",
        default=False)

    incremental : FloatProperty(name="Incremental",
        description="Snap in defined increments",
        default=0,
        min=0,
        step=1,
        precision=3)

    relative_scale : FloatProperty(name="Relative Scale",
        description="Value that divides the global scale",
        default=1,
        min=0,
        step=1,
        precision=3)

    out_color : FloatVectorProperty(name="Floor",
        default=(0.0, 0.0, 0.0, 0.5),
        size=4,
        subtype="COLOR",
        min=0,
        max=1)

    face_color : FloatVectorProperty(name="Face Highlighted",
        default=(1.0, 0.8, 0.0, 0.5),
        size=4,
        subtype="COLOR",
        min=0,
        max=1)

    edge_color : FloatVectorProperty(name="Edge Highlighted",
        default=(0.0, 0.8, 1.0, 0.5),
        size=4,
        subtype="COLOR",
        min=0,
        max=1)

    vert_color : FloatVectorProperty(name="Vertex Highlighted",
        default=(1.0, 0.5, 0.0, 0.5),
        size=4, subtype="COLOR",
        min=0,
        max=1)

    center_color : FloatVectorProperty(name="Middle of the Edge",
        default=(1.0, 0.0, 1.0, 1.0),
        size=4,
        subtype="COLOR",
        min=0,
        max=1)

    perpendicular_color : FloatVectorProperty(name="Perpendicular Point",
        default=(0.1, 0.5, 0.5, 1.0),
        size=4,
        subtype="COLOR",
        min=0,
        max=1)

    constrain_shift_color : FloatVectorProperty(name="Shift Constrain",
        default=(0.8, 0.5, 0.4, 1.0),
        size=4,
        subtype="COLOR",
        min=0,
        max=1)

    tabs : EnumProperty(name="Tabs",
        items = [("GENERAL", "General", ""),
            ("KEYMAPS", "Keymaps", ""),
            ("COLORS", "Colors", ""),
            ("HELP", "Links", ""),],
        default="GENERAL")

    def draw(self, context):
        layout = self.layout

        # TAB BAR
        row = layout.row()
        row.prop(self, "tabs", expand=True)

        box = layout.box()

        if self.tabs == "GENERAL":
            self.draw_general(box)

        elif self.tabs == "COLORS":
            self.draw_snap_utilities_colors(box)

        elif self.tabs == "KEYMAPS":
            self.draw_snap_utilities_keymaps(context, box)

        elif self.tabs == "HELP":
            self.draw_snap_utilities_help(box)

    def draw_general(self, layout):
        row = layout.row()
        col = row.column()

        col.label(text="Snap Properties:")
        col.prop(self, "incremental")
        col.prop(self, "increments_grid")
        if self.increments_grid:
            col.prop(self, "relative_scale")

        col.prop(self, "outer_verts")
        row.separator()

        col = row.column()
        col.label(text="Line Tool:")
        col.prop(self, "intersect")
        col.prop(self, "create_face")

    def draw_snap_utilities_colors(self, layout):
        layout.use_property_split = True

        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)

        flow.prop(self, "out_color")
        flow.prop(self, "constrain_shift_color")
        flow.prop(self, "face_color")
        flow.prop(self, "edge_color")
        flow.prop(self, "vert_color")
        flow.prop(self, "center_color")
        flow.prop(self, "perpendicular_color")

    def draw_snap_utilities_help(self, layout):
        layout.operator("wm.url_open", text="Gumroad Page", icon='HELP',).url = "https://gum.co/IaqQf"

        layout.operator("wm.url_open", text="Blender Market Page", icon='HELP',).url = "https://blendermarket.com/products/snap-utilities"

        layout.operator("wm.url_open", text="Wiki", icon='HELP',).url = "https://github.com/Mano-Wii/Addon-Snap-Utilities-Line/wiki"

        layout.operator("wm.url_open", text="Forum", icon='HELP',).url = "https://blenderartists.org/t/cad-snap-utilities"


    def draw_snap_utilities_keymaps(self, context, layout):
        from .keys import (
            generate_snap_utilities_global_keymaps,
            generate_snap_utilities_tools_keymaps,
        )

        wm = context.window_manager
        #kc = wm.keyconfigs.addon
        kc = wm.keyconfigs.user

        layout.label(text="Global:")

        for km_name, km_args, km_content in generate_snap_utilities_global_keymaps():
            km = kc.keymaps.get(km_name)
            if km:
                self.draw_snap_utilities_km(kc, km, layout)

        layout.label(text="Tools:")

        for km_name, km_args, km_content in generate_snap_utilities_tools_keymaps():
            km = kc.keymaps.get(km_name)
            if km:
                self.draw_snap_utilities_km(kc, km, layout)

    @staticmethod
    def draw_snap_utilities_km(kc, km, layout):
        layout.context_pointer_set("keymap", km)

        row = layout.row()
        row.prop(km, "show_expanded_items", text="", emboss=False)
        row.label(text=km.name, text_ctxt=i18n_contexts.id_windowmanager)

        if km.show_expanded_items:
            col = layout.column()

            for kmi in km.keymap_items:
                if "snap_utilities" in kmi.idname:
                    rna_keymap_ui.draw_kmi(["ADDON", "USER", "DEFAULT"], kc, km, kmi, col, 0)
