from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QDesktopServices

from src.toggleSwitch import ToggleSwitch

class SettingsDialog(QtWidgets.QDialog):
    def __init__(self, parent=None, initial_settings=None):
        super().__init__(parent)
        if parent is not None:
            self.setModal(True)
            self.setParent(parent)

        else:
            self.resize(300, 150)  # 단독 실행 시 크기 설정

        self.use_kipris = None
        self.usage_mode = None
        self.api_key = None

        self.setupUI()

        if initial_settings:
            self.loadSettings(initial_settings)

    def showEvent(self, event):
        super().showEvent(event)
        if self.parent() is not None:
            parent_geometry = self.parent().geometry()
            self.setGeometry(
                parent_geometry.x() + (parent_geometry.width() - self.width()) // 2,
                parent_geometry.y() + (parent_geometry.height() - self.height()) // 2,
                self.width(), self.height()
            )


    def setupUI(self):
        self.mainLayout = QtWidgets.QVBoxLayout(self)

        # 키프리스 사용여부 위젯 및 레이아웃
        self.isUseKiprisWidget = QtWidgets.QWidget(self)
        isUseKipris_layout = QtWidgets.QHBoxLayout(self.isUseKiprisWidget)
        self.isUseKiprisWidget.setLayout(isUseKipris_layout)

        self.isUseKiprisSwitch = ToggleSwitch(self.isUseKiprisWidget)
        self.isUseKiprisSwitch.setChecked(False)
        self.isUseKiprisSwitch.clicked.connect(self.toggleKiprisUsage)
        isUseKipris_layout.addLayout(self.create_label_and_switch(self.isUseKiprisWidget, "키프리스 사용여부", self.isUseKiprisSwitch))
        
        self.helpKiprisBTN = QtWidgets.QPushButton("도움말", self.isUseKiprisWidget)
        self.helpKiprisBTN.clicked.connect(self.helpKipris)
        isUseKipris_layout.addWidget(self.helpKiprisBTN)

        self.mainLayout.addWidget(self.isUseKiprisWidget)

        # 키프리스 설정 위젯 및 레이아웃
        self.settingKiprisWidget = QtWidgets.QWidget(self)
        settingKipris_layout = QtWidgets.QHBoxLayout(self.settingKiprisWidget)
        self.settingKiprisWidget.setLayout(settingKipris_layout)
        self.settingKiprisWidget.setVisible(False)
        self.mainLayout.addWidget(self.settingKiprisWidget)

        # API 방식 사용 위젯 및 레이아웃
        self.apiLayoutWidget = QtWidgets.QWidget(self.settingKiprisWidget)
        apiLayout = QtWidgets.QVBoxLayout(self.apiLayoutWidget)
        self.apiLayoutWidget.setLayout(apiLayout)

        self.apikeySwitch = ToggleSwitch(self.apiLayoutWidget)
        self.apikeySwitch.setChecked(False)
        self.apikeySwitch.clicked.connect(self.toggleAPIUsage)
        apiLayout.addLayout(self.create_label_and_switch(self.apiLayoutWidget, "API 방식 사용", self.apikeySwitch))

        self.editAPIWidget = QtWidgets.QWidget(self.apiLayoutWidget)
        editAPI_layout = self.create_label_and_edit(self.editAPIWidget, "APIKEY", "editable")
        self.editAPIWidget.setLayout(editAPI_layout)
        self.editAPIWidget.findChild(QtWidgets.QLineEdit).setText(self.api_key)
        self.editAPIWidget.findChild(QtWidgets.QLineEdit).textChanged.connect(self.updateApiKey)
        self.editAPIWidget.setVisible(False)
        self.mainLayout.addWidget(self.editAPIWidget)

        # 체크박스 추가
        self.right_rejected_layout = self.create_label_and_check("거절", "출원 후 특허 심사과정에서 실체적인 특허 등록요건을 \n 만족하지 못할 경우에 심사관이 취하는 행정처분")
        self.right_registered_layout = self.create_label_and_check("등록", "심사관이 심사한 결과 등록요건에 적합하여 \n 설정등록을 받을 수 있다는 내용의 행정처분")
        self.right_expiration_layout = self.create_label_and_check("소멸", "특허등록 후 존속기간이 만료되어 \n 권리가 소멸된 상태")
        self.right_void_layout = self.create_label_and_check("무효", "출원 또는 등록된 상태에 대하여 특정 사유로 인해 \n 그 권리나 행위가 무효화 된 상태")
        self.right_Withdrawal_layout = self.create_label_and_check("취하", "출원한 특허가 등록되기전 여러 사유로 인하여 \n 출원이 취소된 상태")
        self.right_remise_layout = self.create_label_and_check("포기", "출원인의 포기서 제출, 등록료 불납 등으로 \n 등록결정이나 권리를 포기한 상태")
        self.right_Disclosure_layout = self.create_label_and_check("공개", "출원이나 등록사실이 일반 공중에게 공표된 상태로 \n 출원 후 18개월이 지난 건")
        
        self.checkWidget = QtWidgets.QWidget()
        self.check_layout = QtWidgets.QGridLayout()

        self.checkWidget.setLayout(self.check_layout)
        self.check_layout.addLayout(self.right_rejected_layout,1,1)
        self.check_layout.addLayout(self.right_registered_layout,1,2)
        self.check_layout.addLayout(self.right_expiration_layout,2,1)
        self.check_layout.addLayout(self.right_void_layout,2,2)
        self.check_layout.addLayout(self.right_Withdrawal_layout,3,1)
        self.check_layout.addLayout(self.right_remise_layout,3,2)
        self.check_layout.addLayout(self.right_Disclosure_layout,4,1)
        self.checkWidget.setVisible(False)
        self.mainLayout.addWidget(self.checkWidget)

# ※ 행정 상태 도움말
# 거절 : 출원 후 특허 심사과정에서 실체적인 특허 등록요건을 만족하지 못할 경우에 심사관이 취하는 행정처분
# 등록 : 심사관이 심사한 결과 등록요건에 적합하여 설정등록을 받을 수 있다는 내용의 행정처분
# 소멸 : 특허등록 후 존속기간이 만료되어 권리가 소멸된 상태
# 무효 : 출원 또는 등록된 상태에 대하여 특정 사유로 인해 그 권리나 행위가 무효화 된 상태
# 취하 : 출원한 특허가 등록되기전 여러 사유로 인하여 출원이 취소된 상태
# 포기 : 출원인의 포기서 제출, 등록료 불납 등으로 등록결정이나 권리를 포기한 상태
# 공개 : 출원이나 등록사실이 일반 공중에게 공표된 상태로 출원 후 18개월이 지난 건
# ＊조기공개신청시 18개월 미만도 공개가능
# 


        settingKipris_layout.addWidget(self.apiLayoutWidget)

        # 웹방식 사용 위젯 및 레이아웃
        self.webLayoutWidget = QtWidgets.QWidget(self.settingKiprisWidget)
        webLayout = QtWidgets.QVBoxLayout(self.webLayoutWidget)
        self.webLayoutWidget.setLayout(webLayout)

        self.useWebSwitch = ToggleSwitch(self.webLayoutWidget)
        self.useWebSwitch.setChecked(True)
        self.useWebSwitch.clicked.connect(self.toggleWebUsage)
        webLayout.addLayout(self.create_label_and_switch(self.webLayoutWidget, "웹방식 사용", self.useWebSwitch))

        settingKipris_layout.addWidget(self.webLayoutWidget)

        # 확인 및 취소 버튼
        buttons = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel, parent=self)
        buttons.accepted.connect(self.onAccepted)
        buttons.rejected.connect(self.reject)
        self.mainLayout.addWidget(buttons)

    def onAccepted(self):
        # 각 위젯의 상태를 클래스 변수에 저장
        self.use_kipris = self.isUseKiprisSwitch.isChecked()
        self.usage_mode = 'api' if self.apikeySwitch.isChecked() else 'web'
        self.api_key = self.editAPIWidget.findChild(QtWidgets.QLineEdit).text()
        self.accept()

    def loadSettings(self, settings):
        # print(f"SettingsDialog settings : {settings}")

        self.use_kipris = settings.get('use_kipris', False)  # 기본값 False로 설정
        self.usage_mode = settings.get('usage_mode', 'web')  # 기본값 'web'로 설정
        self.api_key = settings.get('api_key', '')  # 기본값 빈 문자열로 설정
        # 상태 업데이트 로그 출력
        # print(f"SettingsDialog Loaded settings: use_kipris={self.use_kipris}, usage_mode={self.usage_mode}, api_key={self.api_key}")


        # print(f"SettingsDialog self.use_kipris : {self.use_kipris}")
        # UI 업데이트
        self.isUseKiprisSwitch.setChecked(self.use_kipris)
        self.apikeySwitch.setChecked(self.usage_mode == 'api')
        self.useWebSwitch.setChecked(self.usage_mode == 'web')
        self.editAPIWidget.findChild(QtWidgets.QLineEdit).setText(self.api_key)
        self.settingKiprisWidget.setVisible(self.use_kipris)
        self.editAPIWidget.setVisible(self.usage_mode == 'api')
        self.checkWidget.setVisible(self.use_kipris)

    def updateApiKey(self, text):
        self.api_key = text

    def helpKipris(self):
        dialog = HelpDialog(self)
        dialog.exec_()

    def toggleKiprisUsage(self, checked):
        self.settingKiprisWidget.setVisible(checked)
        self.checkWidget.setVisible(checked)
        self.use_kipris = checked
        # self.kiprisFrame.setVisible(False)

    def toggleAPIUsage(self, checked):
        self.apikeySwitch.setChecked(checked)
        self.useWebSwitch.setChecked(not checked)
        self.editAPIWidget.setVisible(checked)
        self.usage_mode = 'api' if checked else 'web'

    def toggleWebUsage(self, checked):
        self.useWebSwitch.setChecked(checked)
        self.apikeySwitch.setChecked(not checked)
        self.editAPIWidget.setVisible(not checked)
        self.usage_mode = 'web' if checked else 'api'

    def create_label_and_switch(self, widget, label_text, target_switch):
        layout = QtWidgets.QHBoxLayout()
        label = QtWidgets.QLabel(label_text)
        label.setAlignment(QtCore.Qt.AlignCenter)
        layout.addWidget(label)
        layout.addWidget(target_switch)
        return layout

    def create_label_and_edit(self, widget, label_text, state):
        layout = QtWidgets.QHBoxLayout(widget)
        label = QtWidgets.QLabel(label_text)
        label.setAlignment(QtCore.Qt.AlignCenter)
        textField = QtWidgets.QLineEdit() if state == 'editable' else QtWidgets.QPlainTextEdit()
        layout.addWidget(label)
        layout.addWidget(textField)
        return layout
    
    def create_label_and_check(self, label_text, tooltip):
        layout = QtWidgets.QHBoxLayout()
        label = QtWidgets.QLabel(label_text)
        label.setToolTip(tooltip)
        label.setAlignment(QtCore.Qt.AlignCenter)
        checkbox = QtWidgets.QCheckBox()
        checkbox.setToolTip(tooltip)
        layout.addWidget(label)
        layout.addWidget(checkbox)
        return layout



class HelpDialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("도움말")
        if parent is not None:
            self.setModal(True)
            self.setParent(parent)
            # 위치를 부모 윈도우의 중앙으로 설정
            parent_geometry = parent.geometry()
            self.setGeometry(
                parent_geometry.x() + (parent_geometry.width() - 200) // 2,
                parent_geometry.y() + (parent_geometry.height() - 200) // 2,
                400, 300
            )
        else:
            self.resize(400, 300)  # 단독 실행 시 크기 설정
        self.setupUI()

    def setupUI(self):
        layout = QtWidgets.QVBoxLayout(self)
        textBrowser = QtWidgets.QTextBrowser(self)
        textBrowser.setOpenExternalLinks(False)  # 외부 링크 자동 열기 비활성화
        textBrowser.setHtml("""
        <h1>사용 방법 안내</h1>
        <p><b>1.</b> 블라블라블라~#@!!!!!!!!!!!!!!!!!!!!!!!!!!!</p>
        <p><b>2.</b> 블라블라블라42333333333rf3rw3r</p>
        <p>자세한 정보는 <a href='http://example.com'>여기</a>를 클릭하세요.</p>
        <img src='path/to/image.png' alt='이미지 설명'>
        """)
        layout.addWidget(textBrowser)

        textBrowser.anchorClicked.connect(self.handleLinkClick)

        # 확인 버튼 추가
        closeButton = QtWidgets.QPushButton("닫기", self)
        closeButton.clicked.connect(self.close)
        layout.addWidget(closeButton)

    def handleLinkClick(self, url):
        QDesktopServices.openUrl(url)






# ※ 행정 상태 도움말
# 거절 : 출원 후 특허 심사과정에서 실체적인 특허 등록요건을 만족하지 못할 경우에 심사관이 취하는 행정처분
# 등록 : 심사관이 심사한 결과 등록요건에 적합하여 설정등록을 받을 수 있다는 내용의 행정처분
# 소멸 : 특허등록 후 존속기간이 만료되어 권리가 소멸된 상태
# 무효 : 출원 또는 등록된 상태에 대하여 특정 사유로 인해 그 권리나 행위가 무효화 된 상태
# 취하 : 출원한 특허가 등록되기전 여러 사유로 인하여 출원이 취소된 상태
# 포기 : 출원인의 포기서 제출, 등록료 불납 등으로 등록결정이나 권리를 포기한 상태
# 공개 : 출원이나 등록사실이 일반 공중에게 공표된 상태로 출원 후 18개월이 지난 건
# ＊조기공개신청시 18개월 미만도 공개가능
# 