from cms.common import util
from dataAccess import dataAccess


def init_proc(check_kbn, check_period, user_id, check_result):
    db_access = dataAccess.DBAccess()

    if check_period == "":
        now_date = util.now_datetime().strftime('%Y/%m/%d')
    else:
        now_date = check_period

    # ▼▼▼チェック期間の取得▼▼▼
    check_period_list = db_access.select_rows(
        "select"
        "  DATE_FORMAT(stDate, '%Y/%m/%d') as value"
        "  , case DATE_FORMAT(stDate, '%m')"
        "    when DATE_FORMAT(edDate, '%m') "
        "      then CONCAT(DATE_FORMAT(stDate, '%Y'), '年', DATE_FORMAT(stDate, '%m'), '月')"
        "      else CONCAT(DATE_FORMAT(stDate, '%Y'), '年', DATE_FORMAT(stDate, '%m'), '月 ～'"
        "                , DATE_FORMAT(edDate, '%Y'), '年', DATE_FORMAT(edDate, '%m'), '月')"
        "    end as dispValue"
        "  , case DATE_FORMAT(stDate, '%Y/%m/%d')"
        "      when '" + now_date + "' then 'selected'"
        "                              else ''"
        "    end as selectedValue"
        " From m_checkperiod"
        " where checkKbn = " + str(check_kbn) +
        " order by stDate desc")
    if check_period == "":
        proc_date = check_period_list[0]["value"]
    else:
        proc_date = check_period

    # ▼▼▼チェックリストの取得▼▼▼
    row_check_list = db_access.select_rows(
        "select"
        "  m_checklist.checkCode"
        "  , m_checklist.questionNm"
        "  , m_checkanswer.answerCode"
        "  , t_checkresult.checkFlg"
        " From m_checklist"
        " inner join m_checkanswer"
        "   on  m_checklist.checkKbn = m_checkanswer.checkKbn"
        " left outer join t_checkresult"
        "   on  m_checklist.checkKbn = t_checkresult.checkKbn"
        "   and m_checklist.checkCode = t_checkresult.checkCode"
        "   and m_checkanswer.answerCode = t_checkresult.answerCode"
        "   and t_checkresult.userId = " + str(user_id) +
        "   and t_checkresult.implementationDate = '" + proc_date + "'" +
        " where m_checklist.checkKbn = " + str(check_kbn) +
        " and m_checklist.stDate <= '" + now_date + "'"
        " and m_checklist.edDate >= '" + now_date + "'"
        " order by m_checklist.checkCode, m_checkanswer.answerCode")

    # ▼▼▼チェックリストのリスト作成処理▼▼▼
    i = 0
    row_no = None
    question_nm = None
    check_code = None
    check_list = []
    check_box_list = []
    for list in row_check_list:
        if check_code != list["checkCode"]:
            if check_code is not None:
                check_row = {
                    'rowNo': row_no,
                    'questionNm': question_nm,
                    'checkBoxList': check_box_list,
                }
                check_list.append(check_row)
                check_box_list = []

            i += 1
            row_no = i
            question_nm = list["questionNm"].split("\r\n")
            check_code = list["checkCode"]

        checked = ""
        if check_result is None:
            if list["checkFlg"] is not None:
                checked = "checked"

        else:
            # 登録エラー後、再表示用にチェックボックスを編集
            if len(check_result) != 0:
                for row in check_result:
                    if str(list["checkCode"]) == row.split("_")[0]\
                            and str(list["answerCode"]) == row.split("_")[1]:
                        checked = "checked"

        check_box = {
            'checkCode': list["checkCode"],
            'answerCode': list["answerCode"],
            'checkFlg': checked,
        }
        check_box_list.append(check_box)

    check_row = {
        'rowNo': row_no,
        'questionNm': question_nm,
        'checkBoxList': check_box_list,
    }
    check_list.append(check_row)

    # ▼▼▼回答の取得▼▼▼
    row_answer_list = db_access.select_rows(
        "select answerCode, answerNm "
        " from m_checkanswer "
        " where checkKbn = " + str(check_kbn) +
        " order by answerCode")

    # ▼▼▼チェック題名の取得▼▼▼
    row_check_name = db_access.select_row(
        "select kbnKey, name"
        " from m_kbnmeisyo"
        " where kbn = 1"
        " and kbnKey = " + str(check_kbn))

    # ▼▼▼補足文言の取得▼▼▼
    row_hosoku = db_access.select_row(
        "select name"
        " from m_kbnmeisyo"
        " where kbn = 2"
        " and kbnKey = " + str(check_kbn))
    row_hosoku_list = ""
    if row_hosoku != None:
        row_hosoku_list = row_hosoku["name"].split("\r\n")

    # ▼▼▼確定状態の取得▼▼▼
    kakuteiFlg = db_access.select_row(
        "select"
        "  case kakuteiFlg"
        "    when 0 then ''"
        "           else 'disabled'"
        "  end disabled"
        " from m_checkperiod"
        " where checkKbn =  " + str(check_kbn) +
        " and stDate = '" + proc_date + "'")

    return check_period_list, \
        check_list, \
        row_answer_list, \
        row_check_name, \
        row_hosoku_list, \
        proc_date, \
        kakuteiFlg["disabled"]


def regist_check_list(check_kbn, check_result, proc_date, user_id):
    db_access = dataAccess.DBAccess()

    msg = inputCheck(check_kbn, check_result, proc_date)
    if msg is not None:
        return msg

    # ▼▼▼チェック結果の削除▼▼▼
    db_access.regist_db(
        "delete from t_checkresult "
        " where userId = " + str(user_id) +
        " and checkKbn = " + str(check_kbn) +
        " and implementationDate = '" + proc_date + "'")

    # ▼▼▼チェック結果の登録▼▼▼
    for row in check_result:
        db_access.regist_db(
            "insert into t_checkresult "
            " values ("
            + str(check_kbn)
            + "," + str(row.split("_")[0])
            + "," + str(row.split("_")[1])
            + "," + str(user_id)
            + ",'" + proc_date + "'"
            + "," + "1)")

        db_access.commit()


def inputCheck(check_kbn, check_result, proc_date):
    db_access = dataAccess.DBAccess()

    # 必須チェック
    if len(check_result) == 0:
        return "チェックがありません。"

    # 全項目必須チェック
    required_check_flg = db_access.select_row(
        "select value from m_kbnmeisyo where kbn = 4 and kbnKey = " + str(check_kbn))
    if required_check_flg is not None and required_check_flg["value"] == 1:
        check_count = db_access.select_row(
            "select count(*) as CNT"
            " From m_checklist"
            " where m_checklist.checkKbn = " + str(check_kbn) +
            " and m_checklist.stDate <= '" + proc_date + "'"
            " and m_checklist.edDate >= '" + proc_date + "'")
        if len(check_result) != check_count["CNT"]:
            return "チェックされてない項目が存在します。"

    # 複数選択チェック
    bef_check_code = ""
    cnt = 0
    for row in check_result:
        check_code = row.split("_")[0]
        if bef_check_code != check_code:
            bef_check_code = check_code
            cnt = 0

        cnt += 1
        if cnt > 1:
            return "１つの項目に複数選択されています。"

