#------------------------------------------------
#   KZライブラリ    test_sel / 連結線
#                   Ver 2.07.26
#                   written by Fukurou
#------------------------------------------------
import bpy
import blf
import gpu
import math
import numpy as np
import mathutils

from gpu_extras.batch import batch_for_shader
from bpy.types import Operator
from bpy_extras import view3d_utils
from mathutils import Vector
from bpy.props import *
from .module import kzb_mod_base
from .module import kzb_cmp_amadoi


#-----------------------------------------------------------
# 連結線
#-----------------------------------------------------------
class KZBTOOLS_OT_SetNokitoi(bpy.types.Operator):
    bl_idname = 'kzb_set.nokitoi'
    bl_label =  '軒樋'
    bl_description = '２点入力指定'

    mouse_path = []
    mouse_post = []
    select_obj = []
    #モーダル
    def modal(self, context, event):
        context.area.tag_redraw()
        bpy.context.window.cursor_set("CROSSHAIR")  #+カーソル
        #座標取得
        mx = event.mouse_region_x
        my = event.mouse_region_y
        pos = mx, my
        point = Vector((mx, my))
        #取得ポイント数
        n = len(self.mouse_path)
        if event.type == 'MOUSEMOVE':
            #点が登録されているか
            if(n > 1):
                self.mouse_path[-1] = (mx, my)
        elif event.type == 'LEFTMOUSE': #左クリック
            flag, selobj, position = kzb_mod_base.get_vertex2(context, pos)
            if event.value == 'PRESS':
                #点を登録する
                if flag:
                    if(n == 0):
                        self.mouse_path.append(point)
                    self.mouse_path[-1] = point
                    self.mouse_path.append(point)
                    self.mouse_post.append(position)
                    self.select_obj.append(selobj)
                    cnt = len(self.mouse_post)
                    #完了
                    if(cnt > 1):
                        bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
                        #ダイアログクラス呼出
                        p1 = self.mouse_post[0]
                        p2 = self.mouse_post[1]
                        vec = p2 - p1
                        rad = math.atan2(vec[1], vec[0])
                        deg = math.degrees(rad)
                        l   = np.linalg.norm(vec)
                        pos = (p1 + p2)/2
                        print("INPUT 3D")
                        print(vec)
                        print(l)
                        print(deg)
                        print(p1[2])
                        print(pos)
                        KZBTOOLS_OT_DlgNokitoi.length = l
                        KZBTOOLS_OT_DlgNokitoi.kakudo = deg
                        KZBTOOLS_OT_DlgNokitoi.height = pos[2]
                        pos[2] = 0.0
                        KZBTOOLS_OT_DlgNokitoi.comp_pos = pos
                        bpy.ops.kzb_dialog.nokitoi('INVOKE_DEFAULT')
                        return {'FINISHED'}

            return {'RUNNING_MODAL'}

        elif event.type == 'RIGHTMOUSE':    #右クリック
            flag, selobj, position = kzb_mod_base.get_vertex2(context, pos)
            if event.value == 'PRESS':
                #点を登録する
                if flag:
                    if(n == 0):
                        self.mouse_path.append(point)
                    self.mouse_path[-1] = point
                    self.mouse_path.append(point)
                    self.mouse_post.append(position)
                    self.select_obj.append(selobj)
                    cnt = len(self.mouse_post)
                    if(cnt > 1):
                        bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
                        #ダイアログクラス呼出
                        bpy.ops.kzb_dialog.nokitoi('INVOKE_DEFAULT')
                        return {'FINISHED'}

            return {'RUNNING_MODAL'}

        elif event.type == 'ESC':           #中止
            self.select_obj.clear()
            self.mouse_path.clear()
            self.mouse_post.clear()
            bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
            return {'CANCELLED'}

        return {'RUNNING_MODAL'}

    def invoke(self, context, event):
        if context.area.type == 'VIEW_3D':
            args = (self, context)
            self._handle = bpy.types.SpaceView3D.draw_handler_add(draw_callback_pline, args, 'WINDOW', 'POST_PIXEL')

            self.select_obj.clear()
            self.mouse_path.clear()
            self.mouse_post.clear()

            context.window_manager.modal_handler_add(self)
            #メッセージ
            self.report({'INFO'}, "ガイド連結：ガイド端を指定して下さい（２箇所）")
            return {'RUNNING_MODAL'}
        else:
            self.report({'WARNING'}, "View3D not found, cannot run operator")
            return {'CANCELLED'}



#-----------------------------------------------------------
# ダイアログインプット
#-----------------------------------------------------------
class KZBTOOLS_OT_DlgNokitoi(bpy.types.Operator):
    bl_idname = "kzb_dialog.nokitoi"
    bl_label  = "軒樋"
    bl_options = {'REGISTER', 'UNDO'}

    #コンポーネント基点
    comp_pos = Vector((0,0,0))
    length = 0.0
    kakudo = 0.0
    height = 0.0
    #プロパティ
    am_k: EnumProperty(
        name="屋根勾配",
        description="角度を設定",
        default='4',
        items=[
            ('2', "2寸勾配", ""),
            ('3', "3寸勾配", ""),
            ('4', "4寸勾配", ""),
            ('5', "5寸勾配", ""),
            ('6', "6寸勾配", ""),
        ]
    )
    am_t: EnumProperty(
        name="取付形状",
        description="取付部形状",
        default='T',
        items=[
            ('H', "鼻隠", ""),
            ('T', "屋根板", ""),
        ]
    )
    level: FloatProperty(
        name="設置高さ",
        description="取付位置の設定",
        default = 0,
    )
    deg: FloatProperty(
        name="設置角度",
        description="回転角度",
        default = 0,
    )
    offs: FloatProperty(
        name="奥行オフセット",
        description = "柱芯からの距離調整",
        default = 0.1,
    )
    side: FloatProperty(
        name="左右オフセット",
        description = "左右調整",
        default = 0.0,
    )
    am_l: FloatProperty(
        name="軒樋長さ",
        description="全横巾を設定",
        default = 7.0,
    )
    am_f: FloatProperty(
        name="軒樋径",
        description="設定",
        default = 0.11,
    )
    am_d: FloatProperty(
        name="軒樋厚",
        description="設定",
        default = 0.003,
    )
    am_p: FloatProperty(
        name="集水器位置",
        description="設定",
        default = 0.26,
    )
    am_w: FloatProperty(
        name="集水器角寸",
        description="設定",
        default = 0.13,
    )
    am_h: FloatProperty(
        name="集水器高さ",
        description="設定",
        default = 0.14,
    )
    am_u: FloatProperty(
        name="集水器上出",
        description="設定",
        default = 0.03,
    )
    am_a: FloatProperty(
        name="樋受取付長",
        description="長さ",
        default = 0.16,
    )
    am_s: FloatProperty(
        name="樋受ジョイント長",
        description="壁からの間隔を設定",
        default = 0.01,
    )
    am_e: FloatProperty(
        name="樋受設置間隔",
        description="設定",
        default = 1.0,
    )
    am_n: FloatProperty(
        name="樋受金具巾",
        description="設定",
        default = 0.03,
    )
    am_m: FloatProperty(
        name="樋受金具厚",
        description="設定",
        default = 0.003,
    )
    am_r: FloatProperty(
        name="竪樋径",
        description="竪樋と連結",
        default = 0.06,
    )
    am_b: FloatProperty(
        name="竪樋長",
        description="竪樋と連結",
        default = 0.05,
    )
    am_g: FloatProperty(
        name="ガイド長",
        description="連結用ガイド",
        default = 0.06,
    )
    #実行
    def execute(self, context):
        #self.am_l  = self.length + self.offs_length #軒樋長さ
        #self.deg   = self.kakudo + self.offs_deg    #設置角度
        #self.level = self.height + self.offs_level  #設置高さ
        print("====EXE=====")
        print(self.am_l)
        print(self.deg)
        print(self.level)
        print(self.comp_pos)
         #雨樋作成 
        kzb_cmp_amadoi.create_amadoi(self, context)
        return {'FINISHED'}
    #ダイアログ呼出
    def invoke(self, context, event):
        self.am_l  = self.length    #長さ
        self.deg   = self.kakudo    #設置角度
        self.level = self.height    #設置高さ
        wm = context.window_manager
        return wm.invoke_props_dialog(self)
        
    def draw(self, context):
        layout = self.layout

        box = layout.box()
        col = box.column()
        col.use_property_split = True   #メニューを分割表示
        col.label(text="配置オプション")
        col.prop(self, "level") #高さ
        col.prop(self, "deg")   #角度
        col.prop(self, "offs")  #奥行き
        col.prop(self, "side")  #左右
        layout.separator()

        box = layout.box()
        col = box.column()
        col.use_property_split = True   #メニューを分割表示
        col.label(text="ユーザーオプション")
        col.prop(self, "am_k")  #屋根勾配
        col.prop(self, "am_t")  #取付形状
        col.prop(self, "am_l")  #軒樋長
        col.prop(self, "am_p")  #集水器位置
        col.prop(self, "am_a")  #樋受取付長
        col.prop(self, "am_s")  #樋受ジョイント長
        col.prop(self, "am_e")  #樋受設置間隔      
        layout.separator()
        
        box = layout.box()
        col = box.column()
        col.use_property_split = True   #メニューを分割表示
        col.label(text="カスタムオプション")
        col.prop(self, "am_f")  #軒樋径        
        col.prop(self, "am_d")  #軒樋厚      
        col.prop(self, "am_w")  #集水器角寸      
        col.prop(self, "am_h")  #集水器高さ      
        col.prop(self, "am_u")  #集水器上出      
        col.prop(self, "am_n")  #樋受金具巾      
        col.prop(self, "am_m")  #樋受金具厚      
        col.prop(self, "am_r")  #竪樋径      
        col.prop(self, "am_b")  #竪樋長      
        col.prop(self, "am_g")  #ガイド長      
        
#-----------------------------------------------------------
# 描画関数（マーカーとライン）
#-----------------------------------------------------------
def draw_callback_pline(self, context):

    kzb_mod_base.draw_callback_path(self.mouse_path)
    
