from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable


class ComInst(UltmarcTable):
    """レイアウト区分101: COM_施設"""
    dcfhp_id: str               # 施設ｺｰﾄﾞ（ﾚｺｰﾄﾞID）
    dcfhp_code: str             # 施設ｺｰﾄﾞ（施設ｺｰﾄﾞ）
    dcfh_yobi: str              # 施設ｺｰﾄﾞ（予備）
    maint_flag: str             # 修正区分
    maint_date: str             # ﾒﾝﾃﾅﾝｽ年月日
    trn_date: str               # 予備/転送年月日
    uncheck_flag: str           # 未確認ﾌﾗｸﾞ
    hpdel_code: str             # 削除予定理由
    duphp_id: str               # 重複時相手先ｺｰﾄﾞ（ﾚｺｰﾄﾞID）
    duphp_code: str             # 重複時相手先ｺｰﾄﾞ（施設ｺｰﾄﾞ）
    duphp_yobi: str             # 重複時相手先ｺｰﾄﾞ（予備）
    hp_name: str                # 正式施設名(漢字)
    hp_name_kana: str           # 正式施設名(ｶﾅ)
    hp_ryaku_name: str          # 略式施設名(漢字)
    hp_ryaku_name_kana: str     # 略式施設名(ｶﾅ)
    hp_addr_lost_code: str      # 住所不明
    pref_code: str              # 住所ｺｰﾄﾞ（県ｺｰﾄﾞ）
    city_code: str              # 住所ｺｰﾄﾞ（市区町村ｺｰﾄﾞ）
    addr_code1: str             # 住所ｺｰﾄﾞ（大字･通称ｺｰﾄﾞ）
    addr_code2: str             # 住所ｺｰﾄﾞ（字･丁目ｺｰﾄﾞ）
    hp_zip_code: str            # 郵便番号
    hp_addr: str                # 住所(漢字)
    hp_addr_kana: str           # 住所(ｶﾅ)
    hp_addr_number: str         # 住所表示番号
    dr_addr_kanji1: str         # 住所ｶｳﾝﾄ_漢字（県）
    dr_addr_kanji2: str         # 住所ｶｳﾝﾄ_漢字（市区町村）
    dr_addr_kanji3: str         # 住所ｶｳﾝﾄ_漢字（大字･通称）
    dr_addr_kanji4: str         # 住所ｶｳﾝﾄ_漢字（字･丁目）
    dr_addr_kana1: str          # 住所ｶｳﾝﾄ_ｶﾅ（県）
    dr_addr_kana2: str          # 住所ｶｳﾝﾄ_ｶﾅ（市区町村）
    dr_addr_kana3: str          # 住所ｶｳﾝﾄ_ｶﾅ（大字･通称）
    dr_addr_kana4: str          # 住所ｶｳﾝﾄ_ｶﾅ（字･丁目）
    tel_nothing_flag: str       # 電話番号なしﾌﾗｸﾞ
    hp_tel: str                 # 電話番号
    mgt_class_code: str         # 経営体
    hp_class_code: str          # 施設区分
    president_id: str           # 代表者ｺｰﾄﾞ（ﾚｺｰﾄﾞID）
    president_code: str         # 代表者ｺｰﾄﾞ（個人ｺｰﾄﾞ）
    president_yobi: str         # 代表者ｺｰﾄﾞ（予備）
    president: str              # 代表者(漢字)
    president_kana: str         # 代表者(ｶﾅ)
    open_flag: str              # 開業予定ﾌﾗｸﾞ
    open_year_month: str        # 開業予定年月
    close_flag: str             # 休院ﾌﾗｸﾞ
    close_year_month: str       # 休院開始年月
    medsbj_code: list           # 診療科目1～60
    hp_kind_code: str           # 病院種別
    reexam_flag: str            # 再審査区分
    assoc_parrent_id: str       # 関連大学親ｺｰﾄﾞ（ﾚｺｰﾄﾞID）
    assoc_parrent_code: str     # 関連大学親ｺｰﾄﾞ（施設ｺｰﾄﾞ）
    assoc_parrent_yobi: str     # 関連大学親ｺｰﾄﾞ（予備）
    close_flag2: str            # 病棟閉鎖ﾌﾗｸﾞ
    bed_num: str                # 病床数(定員)
    bed_class_maint_date: str   # 許可病床ﾒﾝﾃ日付
    bed_num_sum: str            # 許可病床数_合計
    bed_num_psy: str            # 許可病床数_精神
    bed_num_tub: str            # 許可病床数_結核
    bed_num_epi: str            # 許可病床数_感染症
    bed_num_gen: str            # 許可病床数_その他
    bed_num_gen2: str           # 許可病床数_一般病床
    bed_num_rest: str           # 許可病床数_療養病床
    inspect_code1: str          # 検査項目_微生物
    inspect_code2: str          # 検査項目_血清
    inspect_code3: str          # 検査項目_血液
    inspect_code4: str          # 検査項目_病理
    inspect_code5: str          # 検査項目_寄生虫
    inspect_code6: str          # 検査項目_生化
    inspect_code7: str          # 検査項目_RI
    dcfhp_92id: str             # 特養医務室ｺｰﾄﾞ（ﾚｺｰﾄﾞID）
    dcfhp_92code: str           # 特養医務室ｺｰﾄﾞ（施設ｺｰﾄﾞ）
    dcfhp_92yobi: str           # 特養医務室ｺｰﾄﾞ（予備）

    dcfdsf_inst_code: str       # DCFDSF施設コード
    univ_prnt_code: str         # 関連大学親コード
    inst_repre_code: str        # 施設代表者コード
    village_code: str           # 町字コード
    addr_cnt_kana: str          # 住所カウントカナ
    addr_cnt: str               # 住所カウント
    dup_opp_code: str           # 重複時相手先コード
    dcf_prnt_inst_code: str     # DCF親施設コード

    prmit_bed: list             # 許可ベッド（集合項目）
    insp_item: list             # 検査項目（集合項目）

    def __init__(self, record: list[str]):
        super().__init__(record)
        self.dcfhp_id = record[1]
        self.dcfhp_code = record[2]
        self.dcfh_yobi = record[3].strip()
        self.maint_flag = record[4]
        self.maint_date = record[5]
        self.trn_date = record[6]
        self.uncheck_flag = record[7].strip()
        self.hpdel_code = record[8].strip()
        self.duphp_id = record[9]
        self.duphp_code = record[10].strip()
        self.duphp_yobi = record[11].strip()
        self.hp_name = record[12].strip()
        self.hp_name_kana = record[13].strip()
        self.hp_ryaku_name = record[14].strip()
        self.hp_ryaku_name_kana = record[15].strip()
        self.hp_addr_lost_code = record[16].strip()
        self.pref_code = record[17].strip()
        self.city_code = record[18].strip()
        self.addr_code1 = record[19].strip()
        self.addr_code2 = record[20].strip()
        self.hp_zip_code = record[21].strip()
        self.hp_addr = record[22]
        self.hp_addr_kana = record[23]
        self.hp_addr_number = record[24]
        self.dr_addr_kanji1 = record[25].strip()
        self.dr_addr_kanji2 = record[26].strip()
        self.dr_addr_kanji3 = record[27].strip()
        self.dr_addr_kanji4 = record[28].strip()
        self.dr_addr_kana1 = record[29].strip()
        self.dr_addr_kana2 = record[30].strip()
        self.dr_addr_kana3 = record[31].strip()
        self.dr_addr_kana4 = record[32].strip()
        self.tel_nothing_flag = record[33].strip()
        self.hp_tel = record[34].strip()
        self.mgt_class_code = record[35].strip()
        self.hp_class_code = record[36].strip()
        self.president_id = record[37]
        self.president_code = record[38].strip()
        self.president_yobi = record[39]
        self.president = record[40].strip()
        self.president_kana = record[41].strip()
        self.open_flag = record[42].strip()
        self.open_year_month = record[43].strip()
        self.close_flag = record[44].strip()
        self.close_year_month = record[45].strip()

        # 診療科目1～60(csvカラム番号　46 ～ 105)
        # rangeの第2引数の数字はループに含まれないため、+1を指定する
        self.medsbj_code = []
        for i in range(46, 106):
            self.medsbj_code.append(str(record[i]))

        self.hp_kind_code = record[106].strip()
        self.reexam_flag = record[107].strip()
        self.assoc_parrent_id = record[108].strip()
        self.assoc_parrent_code = record[109].strip()
        self.assoc_parrent_yobi = record[110].strip()
        self.close_flag2 = record[111].strip()
        self.bed_num = record[112].strip()
        self.bed_class_maint_date = record[113].strip()
        self.bed_num_sum = record[114].strip()
        self.bed_num_psy = record[115].strip()
        self.bed_num_tub = record[116].strip()
        self.bed_num_epi = record[117].strip()
        self.bed_num_gen = record[118].strip()
        self.bed_num_gen2 = record[119].strip()
        self.bed_num_rest = record[120].strip()

        # smallint型のカラム値は、空文字で渡ってきた場合はNULLに変換する
        self.bed_num = self.bed_num if len(self.bed_num) > 0 else None
        self.bed_num_sum = self.bed_num_sum if len(self.bed_num_sum) > 0 else None
        self.bed_num_psy = self.bed_num_psy if len(self.bed_num_psy) > 0 else None
        self.bed_num_tub = self.bed_num_tub if len(self.bed_num_tub) > 0 else None
        self.bed_num_epi = self.bed_num_epi if len(self.bed_num_epi) > 0 else None
        self.bed_num_gen = self.bed_num_gen if len(self.bed_num_gen) > 0 else None
        self.bed_num_gen2 = self.bed_num_gen2 if len(self.bed_num_gen2) > 0 else None
        self.bed_num_rest = self.bed_num_rest if len(self.bed_num_rest) > 0 else None

        self.inspect_code1 = record[121].strip()
        self.inspect_code2 = record[122].strip()
        self.inspect_code3 = record[123].strip()
        self.inspect_code4 = record[124].strip()
        self.inspect_code5 = record[125].strip()
        self.inspect_code6 = record[126].strip()
        self.inspect_code7 = record[127].strip()
        self.dcfhp_92id = record[128].strip()
        self.dcfhp_92code = record[129].strip()
        self.dcfhp_92yobi = record[130].strip()

        # 住所ｶｳﾝﾄ_漢字の０埋め
        self.dr_addr_kanji1 = self.dr_addr_kanji1.zfill(2)
        self.dr_addr_kanji2 = self.dr_addr_kanji2.zfill(2)
        self.dr_addr_kanji3 = self.dr_addr_kanji3.zfill(2)
        self.dr_addr_kanji4 = self.dr_addr_kanji4.zfill(2)

        # 住所ｶｳﾝﾄ_ｶﾅの０埋め
        self.dr_addr_kana1 = self.dr_addr_kana1.zfill(2)
        self.dr_addr_kana2 = self.dr_addr_kana2.zfill(2)
        self.dr_addr_kana3 = self.dr_addr_kana3.zfill(2)
        self.dr_addr_kana4 = self.dr_addr_kana4.zfill(2)

        # DCFDSF施設コード
        self.dcfdsf_inst_code = self.dcfhp_id + self.dcfhp_code + self.dcfh_yobi
        # 関連大学親コード
        self.univ_prnt_code = self.assoc_parrent_id + self.assoc_parrent_code + self.assoc_parrent_yobi
        # 施設代表者コード
        self.inst_repre_code = self.president_id + self.president_code + self.president_yobi
        # 町字コード
        self.village_code = self.pref_code + self.city_code + self.addr_code1 + self.addr_code2
        # 住所カウントカナ
        self.addr_cnt_kana = self.dr_addr_kana1 + self.dr_addr_kana2 + self.dr_addr_kana3 + self.dr_addr_kana4
        # 住所カウント
        self.addr_cnt = self.dr_addr_kanji1 + self.dr_addr_kanji2 + self.dr_addr_kanji3 + self.dr_addr_kanji4
        # 重複時相手先コード
        self.dup_opp_code = self.duphp_id + self.duphp_code + self.duphp_yobi
        # DCF親施設コード
        self.dcf_prnt_inst_code = self.dcfhp_92id + self.dcfhp_92code + self.dcfhp_92yobi

        # 許可ベッド（集合項目）
        self.prmit_bed = [
            self.bed_num_sum,
            self.bed_num_psy,
            self.bed_num_tub,
            self.bed_num_epi,
            self.bed_num_gen,
            self.bed_num_gen2,
            self.bed_num_rest
        ]

        # 検査項目（集合項目）
        self.insp_item = [
            self.inspect_code1,
            self.inspect_code2,
            self.inspect_code3,
            self.inspect_code4,
            self.inspect_code5,
            self.inspect_code6,
            self.inspect_code7
        ]
