#------------------------------------------------
#   KZライブラリ    blk_windema / 庇付き出窓（ブロック）
#                   Ver 2.09.18
#                   Ver 2.09.12
#                   Ver 2.09.04
#                   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 . kzb_std_compo import KZBTOOLS_OT_SetComp
from .module import kzb_mod_base
from .module import kzb_cmp_tobukuro
from .module import kzb_cmp_rokuhisasi
from . import kzb_std_base

#-----------------------------------------------------------
# 位置設定クラス
#-----------------------------------------------------------
class KZBTOOLS_OT_SetBlkKousi(KZBTOOLS_OT_SetComp):
    bl_idname = 'kzb_set.blk_kousi'
    bl_label  = '出窓位置'
    bl_description = '窓の位置設定'

    def comp_main(self, pos):
        #窓作成
        KZBTOOLS_OT_DlgBlkKousi.comp_pos = pos
        bpy.ops.kzb_dialog.blk_kousi('INVOKE_DEFAULT')

#-----------------------------------------------------------
# ダイアログインプット
#-----------------------------------------------------------
class KZBTOOLS_OT_DlgBlkKousi(bpy.types.Operator):
    bl_idname = "kzb_dialog.blk_kousi"
    bl_label = "出窓"
    bl_options = {'REGISTER', 'UNDO'}

    #コンポーネント基点
    comp_pos = Vector((0,0,0))
    #プロパティ
    hakama_bool: BoolProperty(
        name="袴設置",
        description="袴有無",
        default = True,
    )
    type: EnumProperty(
        name="窓タイプ",
        description="スライド面",
        default='G',
        items=[
            ('F', "フラット", ""),
            ('U', "襖（板戸）", ""),
            ('G', "ガラス戸", ""),
            ('S', "障子戸", ""),
        ]
    )
    level: FloatProperty(
        name="設置高さ",
        description="窓上端高基準",
        default = 2.3,
    )
    deg: FloatProperty(
        name="設置角度",
        description="回転角度",
        default = 0,
    )
    offs: FloatProperty(
        name="奥行きオフセット",
        description = "柱芯からのオフセット",
        default = 0.0,
    )
    side: FloatProperty(
        name="サイドオフセット",
        description = "左右調整",
        default = 0.0,
    )
    width: FloatProperty(
        name="横巾",
        description="",
        default = 1.69,
    )
    height: FloatProperty(
        name="縦巾",
        description="",
        default = 0.9,
    )
    nv: IntProperty(
        name="縦桟数",
        description="",
        default = 0,
    )
    nh: IntProperty(
        name="横桟数",
        description="",
        default = 2,
    )
    depth: FloatProperty(
        name="出窓巾",
        description = "出窓巾",
        default = 0.3,
    )
    noki: FloatProperty(
        name="軒先長",
        description = "軒の長さ",
        default = 0.3,
    )
    waki: FloatProperty(
        name="軒巾両脇",
        description = "軒の長さ",
        default = 0.14,
    )
    hakama: FloatProperty(
        name="袴長さ",
        description = "外枠下袴の長さ",
        default = 0.4,
    )
    def execute(self, context):
        create_blk_kousi(self, context)
        return {'FINISHED'}

    #ダイアログ呼出
    def invoke(self, context, event):
        wm = context.window_manager
        return wm.invoke_props_dialog(self)

#-------------------------------------------------
# 窓作成
#-------------------------------------------------
def create_blk_kousi(self, context):
    #global comp_pos, kz_mx, kz_my
    type  = self.type   #窓タイプ
    level = self.level  #上枠高さ
    depth = self.depth  #出窓巾
    w     = self.width  #横巾
    h     = self.height #縦巾
    fw    = 0.04        #外枠見付
    ifw   = 0.04        #戸枠巾
    ifd   = 0.04        #戸枠厚
    sfw   = 0.02        #桟巾
    sfd   = 0.04        #桟厚
    nv    = self.nv     #縦桟数
    nh    = self.nh     #横桟数
    offs  = self.offs   #奥行きオフセット
    side  = self.side   #サイドオフセット
    iw    = 0.04        #内壁厚
    io    = 0.075       #外壁厚
    top   = 0.03        #上部角材寸法
    nd    = 0.015       #屋根板厚
    nf    = 0.005       #表面材厚
    gap   = 0.01        #表材突出し寸法

    #勾配3寸
    rad = math.radians(16.7)
    #角度
    sn = math.sin(rad)
    cs = math.cos(rad)
    tn = math.tan(rad)
    #外枠見込
    fd  = depth + iw + io           #外枠厚
    pt  = Vector((side, offs, level))
    pt0 = pt + Vector((0, -io, 0))
    pt1 = pt0 + Vector((0, 0, top + depth *tn))
    pt2 = pt1 + Vector((0, 0, nd/cs))
    pt3 = pt2 + Vector((0, 0, nf/cs))
    pt4 = pt0 + Vector((0, -depth, 0))
    pt5 = pt4 + Vector((0, 0, top))
    l1 = depth + self.noki
    pt9 = pt3 + Vector((0, -l1, -l1*tn))
    pt8 = pt9 + Vector((0, nf*sn, -nf*cs))
    l2  = l1 - gap
    pt7 = pt2 + Vector((0, -l2, -l2*tn))
    pt6 = pt7 + Vector((0, nd*sn, -nd*cs))
    #グループの親
    group = kzb_mod_base.create_emptyobj("kz_window", 'PLAIN_AXES', 0.8)
    group1 = kzb_mod_base.create_emptyobj("kz_winde", 'PLAIN_AXES', 0.2)
    ptw  = Vector((side, offs, level- self.height/2.0))
    #コントロールボックス
    ctrl = kzb_mod_base.create_cbox(ptw, w, fd*1.4, h, "kz_control")
    ctrl.HoleCtrl = True
    ctrl.parent = group1
    #外枠作成
    object = kzb_mod_base.frame_ptunit(ptw, w, h, fw, fw, fw, fd, 0.0)
    object.parent = group1
    #出窓部移動
    group1.location.y += -fd/2.0 + iw

    #内戸作成
    iw = (w -fw * 2.0 + ifw) / 2.0  #内巾
    ih = h - fw - fw                #内高
    sx = (w - fw*2.0 - ifw)/4.0
    sy = ifd/2.0
    shift = - fd/2.0 + ifd*2.0
    v1 = Vector((sx,  shift - sy, 0))
    v2 = Vector((-sx, shift + sy, 0))
    pos = ptw + v1
    object = kzb_mod_base.slider_ptunit(pos, type, iw, ih, ifw, ifw, ifw, ifd, sfw, sfd, nv, nh, 0.0)
    object.parent = group1
    pos = ptw + v2
    object = kzb_mod_base.slider_ptunit(pos, type, iw, ih, ifw, ifw, ifw, ifd, sfw, sfd, nv, nh, 0.0)
    object.parent = group1
    group1.parent = group
    #庇作成
    group2 = kzb_mod_base.create_emptyobj("kz_windehisasi", 'PLAIN_AXES', 0.2)
    #壁
    verts = []
    verts.append(pt1)
    verts.append(pt0)
    verts.append(pt4)
    verts.append(pt5)
    object = kzb_mod_base.create_face(verts, self.width)
    object.parent = group2
    group2.parent = group
    #屋根板
    verts = []
    verts.append(pt2)
    verts.append(pt1)
    verts.append(pt6)
    verts.append(pt7)
    rwidth = self.width + self.waki*2.0
    object = kzb_mod_base.create_face(verts, rwidth)
    object.parent = group2
    group2.parent = group
    #表板
    verts = []
    verts.append(pt3)
    verts.append(pt2)
    verts.append(pt8)
    verts.append(pt9)
    twidth = rwidth + gap * 2.0
    object = kzb_mod_base.create_face(verts, rwidth)
    object.parent = group2
    group2.parent = group
    """
    #袴
    if self.hakama_bool:
        pt14 = pt0 - Vector((0, 0, self.height))
        pt10 = pt14 - Vector((0, self.depth, 0))
        pt11 = pt10 - Vector((0, 0, self.hakama/2.0))
        pt12 = pt11 + Vector((0, self.hakama/2.0, -self.hakama/2.0))
        pt13 = pt14 - Vector((0, 0, self.hakama))
        vec = Vector((self.width/2 - fw/2, 0, 0))
        p1 = pt14 + vec
        p2 = pt13 + vec
        p3 = pt12 + vec
        p4 = pt11 + vec
        p5 = pt10 + vec
        verts = []
        verts.append(p1)
        verts.append(p2)
        verts.append(p3)
        verts.append(p4)
        verts.append(p5)
        object = kzb_mod_base.create_face(verts, fw)
        object.parent = group2
        group2.parent = group
        p1 = pt14 - vec
        p2 = pt13 - vec
        p3 = pt12 - vec
        p4 = pt11 - vec
        p5 = pt10 - vec
        verts = []
        verts.append(p1)
        verts.append(p2)
        verts.append(p3)
        verts.append(p4)
        verts.append(p5)
        object = kzb_mod_base.create_face(verts, fw)
        object.parent = group2
        group2.parent = group
        #腰板部
        pt15 = pt10 + Vector((0, 0.01, 0))
        pt16 = pt15 + Vector((0, fw, 0))
        pt17 = pt16 - Vector((0, 0, self.hakama/2))
        pt18 = pt15 - Vector((0, 0, self.hakama/2))
        verts = []
        verts.append(pt15)
        verts.append(pt16)
        verts.append(pt17)
        verts.append(pt18)
        object = kzb_mod_base.create_face(verts, w - fw*2)
        object.parent = group2
        group2.parent = group
    """
    #************************************************************
    #回転
    group.rotation_euler.rotate_axis('Z', math.radians(self.deg))
    #位置設定
    group.location += self.comp_pos
    #アクテイブ化
    kzb_mod_base.set_active(group)
