/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JFUMkmInfoAddUtil
*	ソースファイル名：JFUMkmInfoAddUtil.java
*	作成者			：富士通
*	日付			：2022年2月8日
*＜機能概要＞
*	申込情報登録(フロンティア)共通部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v58.00.00	2022/2/8	FJ			ANK-4217-00-00_一般Webサービス申込機能再構築に伴うAPI作成
*   v71.00      2024/04/02  FJ) 張本    【ANK-4468-00-00】eo光ネット「シンプルプラン」追加対応
*   v67.0.0		2023/08/09	FJ) 飯田	ANK-4467-00-00_FRONTIERのマンション導線巻き取りに伴うAPI変更
*   v73.00      2024/11/15  FJ) 張本    【ANK-4493-00-00】【eo定期】光配線マンションのコースアップ対応
**********************************************************************/
package eo.common.util;

import java.io.IOException;
import java.util.Map;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import eo.common.constant.JFUStrConst;

public class JFUMkmInfoAddUtil extends JPCUtilCommon
{
	/**
	 * map形式からJSON形式に変換する。
	 * @param Map<String, Object> 入力パラメータ
	 * @return JSON形式のリクエストパラメータを返却する。
	 * @throws IOException JOSN形式へ変換する際のI/O例外
	 */
	public static String mapToJson(Map<String, Object> requestMap) throws IOException
	{
		// 変換後文字列
		String json = "";
		ObjectMapper mapper = new ObjectMapper();
		mapper.enable(SerializationFeature.INDENT_OUTPUT);
		try
		{
			// JOSN形式へ変換
			json = mapper.writeValueAsString(requestMap);

		} catch (IOException e)
		{
			e.printStackTrace();
			throw e;
		}
		return json;
	}
	/**
	 * JSON形式からmap形式に変換する。
	 * @param Map<String, Object> 入力パラメータ
	 * @return JSON形式のリクエストパラメータを返却する。
	 * @throws Exception 
	 */
	public static Map<String, Object> jsonToMap(String json) throws Exception
	{
		// 変換後Mapper
		Map<String, Object> map = null;
		ObjectMapper mapper = new ObjectMapper();
		try
		{
			map = mapper.readValue(json, new TypeReference<Map<String, Object>>(){});
		} catch (Exception e)
		{
			e.printStackTrace();
			throw e;
		}
		return map;
	}

	/**
	 * ネットの料金コースを取得する。
	 * 
	 * <br>
	 * @param netCourse ネットコース
	 * @return 料金コースコード
	 */
	public static String getPcrsCdHomeNet(String netCourse)
	{

		// 100Ｍコース
		if (JFUStrConst.NET_COURSE_100M.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A03;
		}
		// 1ギガコース
		else if (JFUStrConst.NET_COURSE_1G.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A05;
		}
		// 200Ｍコース
		else if (JFUStrConst.NET_COURSE_200M.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A07;
		}
		// 100Ｍライトコース
		else if (JFUStrConst.NET_COURSE_100M_LIGHT.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A03;
		}
		// 5ギガコース
		else if (JFUStrConst.NET_COURSE_5G.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A89;
		}
		// 10ギガコース
		else if (JFUStrConst.NET_COURSE_10G.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A83;
		}
		// 1ギガコース Netflixパック
		else if (JFUStrConst.NET_COURSE_1G_NF.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A91;
		}
		// 5ギガコース Netflixパック
		else if (JFUStrConst.NET_COURSE_5G_NF.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A93;
		}
		// 10ギガコース Netflixパック
		else if (JFUStrConst.NET_COURSE_10G_NF.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A95;
		}
		// シンプル10ギガコース
		else if (JFUStrConst.NET_COURSE_S_10G.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00134_A97;
		}
		// シンプル10ギガコース Netflixパック
		else if (JFUStrConst.NET_COURSE_S_10G_NF.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00134_A99;
		}

		return null;
	}

	/**
	 * ネットの料金コースを取得する。
	 * 
	 * <br>
	 * @param netCourse ネットコース
	 * @return 料金コースコード
	 */
	public static String getPcrsCdMezonNet(String netCourse)
	{

		// メゾンタイプ100Ｍ
		if (JFUStrConst.NET_COURSE_100M.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A08;
		}
		// メゾンタイプ1ギガ
		else if (JFUStrConst.NET_COURSE_1G.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A10;
		}
		// メゾンタイプ200Ｍ
		else if (JFUStrConst.NET_COURSE_200M.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A11;
		}
		// メゾンタイプ100Ｍライトコース
		else if (JFUStrConst.NET_COURSE_100M_LIGHT.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A08;
		}
		// メゾンタイプ5ギガ
		else if (JFUStrConst.NET_COURSE_5G.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A90;
		}
		// メゾンタイプ10ギガ
		else if (JFUStrConst.NET_COURSE_10G.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A84;
		}
		// 1ギガコース Netflixパック
		else if (JFUStrConst.NET_COURSE_1G_NF.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A92;
		}
		// 5ギガコース Netflixパック
		else if (JFUStrConst.NET_COURSE_5G_NF.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A94;
		}
		// 10ギガコース Netflixパック
		else if (JFUStrConst.NET_COURSE_10G_NF.equals(netCourse))
		{
			// 料金コースコード
			return JFUStrConst.CD00134_A96;
		}

		return null;
	}

	/**
	 * ネットの料金コースを取得する。
	 * 
	 * <br>
	 * @param tkHoshikiCd 提供方式コード
	 * @param tkPrcSbtCd 提供料金種別コード
	 * @param tkHoshikiChgSbtCd 提供方式変更種別コード
	 * @param netCourse ネットコース
	 * @return 料金コースコード
	 */
	public static String getPcrsCdMansionNet(String tkHoshikiCd,String tkPrcSbtCd,String tkHoshikiChgSbtCd,String netCourse)
	{
		// マンションのフロント用提供方式パターンを取得
		String fuTeikyoHoshikiPtnCd = JFUMkmInfoAddUtil.getFuTeikyoHoshikiPtnCd(tkHoshikiCd, tkPrcSbtCd);

		// 料金コースコード、料金プランコードの設定
		if (isTkHosikiChgSbtCd(tkHoshikiChgSbtCd))
		{
			// 提供方式変更の場合

			// マンションタイプ　光配線　１ギガ 
			return JFUStrConst.CD00134_A57;
		}
		else if (JFUStrConst.TK_HOSHIKI_PTN_GG_ENET.equals(fuTeikyoHoshikiPtnCd))
		{
			// 提供方式パターンがギガイーサの場合

			if ("1".equals(netCourse))
			{
				// 光ネットコースが「1:100Mコース」の場合

				// マンションタイプ　グローバル　１００Ｍプレミアム　イーサネット
				return JFUStrConst.CD00134_A70;
			}
			else if ("3".equals(netCourse))
			{
				// 光ネットコースが「3:１Ｇ」の場合

				// マンションタイプ　グローバル　１ギガ　イーサネット
				return JFUStrConst.CD00134_A55;
			}
		}
		else if (JFUStrConst.TK_HOSHIKI_PTN_HIKARI_HAISEN.equals(fuTeikyoHoshikiPtnCd))
		{
			// 提供方式パターンがギガイーサ、光配線のどちらかの場合

			if ("1".equals(netCourse))
			{
				// 光ネットコースが「1:100Mコース」の場合

				// マンションタイプ　光配線　１００Ｍプレミアム
				return JFUStrConst.CD00134_A71;
			}
			else if ("3".equals(netCourse))
			{
				// 光ネットコースが「3:１Ｇ」の場合

				// マンションタイプ　光配線　１ギガ
				return JFUStrConst.CD00134_A57;
			}
			else if ("6".equals(netCourse))
			{
				// 光ネットコースが「6:１０Ｇ」の場合

				// マンションタイプ　光配線　１０ギガ
				return JFUStrConst.CD00134_A74;
			}
		}
		else if (JFUStrConst.TK_HOSHIKI_ENET.equals(tkHoshikiCd))
		{
			// 提供方式がイーサーの場合

			// マンションタイプ　グローバル　１００Ｍ　イーサネット
			return JFUStrConst.CD00134_A54;
		}

		// 提供方式パターンが"VDSL"もしくは"VDSL-S"の場合
		if (JFUStrConst.TK_HOSHIKI_PTN_VDSL.equals(fuTeikyoHoshikiPtnCd) || JFUStrConst.TK_HOSHIKI_PTN_VDSLS.equals(fuTeikyoHoshikiPtnCd))
		{
			if (JFUStrConst.TK_HOSHIKI_VDSL2.equals(tkHoshikiCd))
			{
				// 提供方式がVDSL2の場合

				// マンションタイプ　グローバル　１００Ｍ　ＶＤＳＬ
				return JFUStrConst.CD00134_A50;
			}
			else if (JFUStrConst.TK_HOSHIKI_VDSL3.equals(tkHoshikiCd))
			{
				// 提供方式がVDSL3の場合

				// マンションタイプ　グローバル　１００Ｍ　ＶＤＳＬ
				return JFUStrConst.CD00134_A51;
			}
			else if (JFUStrConst.TK_HOSHIKI_VDSL4.equals(tkHoshikiCd))
			{
				// 提供方式がVDSL4の場合

				// マンションタイプ　グローバル　１００Ｍ　ＶＤＳＬ
				return JFUStrConst.CD00134_A52;

			}
			else if (JFUStrConst.TK_HOSHIKI_VDSL5.equals(tkHoshikiCd))
			{
				// 提供方式がVDSL5の場合

				// マンションタイプ　グローバル　１００Ｍ　ＶＤＳＬ
				return JFUStrConst.CD00134_A53;
			}
		}
		return null;
	}

	/**
	 * ネットの料金プランを取得する。
	 * 
	 * <br>
	 * @param netCourse ネットコース
	 * @return 料金プランコード
	 */
	public static String getPplanCdHomeNet(String netCourse)
	{

		// 100Ｍコース
		if (JFUStrConst.NET_COURSE_100M.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA0301;
		}
		// 1ギガコース
		else if (JFUStrConst.NET_COURSE_1G.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA0501;
		}
		// 200Ｍコース
		else if (JFUStrConst.NET_COURSE_200M.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA0701;
		}
		// 100Ｍライトコース
		else if (JFUStrConst.NET_COURSE_100M_LIGHT.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA0311;
		}
		// 5ギガコース
		else if (JFUStrConst.NET_COURSE_5G.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA8901;
		}
		// 10ギガコース
		else if (JFUStrConst.NET_COURSE_10G.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA8301;
		}
		// 1ギガコース Netflixパック
		else if (JFUStrConst.NET_COURSE_1G_NF.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA9101;
		}
		// 5ギガコース Netflixパック
		else if (JFUStrConst.NET_COURSE_5G_NF.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA9301;
		}
		// 10ギガコース Netflixパック
		else if (JFUStrConst.NET_COURSE_10G_NF.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA9501;
		}
		// シンプル10ギガコース
		else if (JFUStrConst.NET_COURSE_S_10G.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA9701;
		}
		// シンプル10ギガコース Netflixパック
		else if (JFUStrConst.NET_COURSE_S_10G_NF.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA9901;
		}

		return null;
	}

	/**
	 * ネットの料金プランを取得する。
	 * 
	 * <br>
	 * @param netCourse ネットコース
	 * @return 料金プランコード
	 */
	public static String getPplanCdMezonNet(String netCourse)
	{

		// メゾンタイプ100Ｍ
		if (JFUStrConst.NET_COURSE_100M.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA0801;
		}
		// メゾンタイプ1ギガ
		else if (JFUStrConst.NET_COURSE_1G.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA1001;
		}
		// メゾンタイプ200Ｍ
		else if (JFUStrConst.NET_COURSE_200M.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA1101;
		}
		// メゾンタイプ100Ｍライトコース
		else if (JFUStrConst.NET_COURSE_100M_LIGHT.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA0811;
		}
		// メゾンタイプ5ギガ
		else if (JFUStrConst.NET_COURSE_5G.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA9001;
		}
		// メゾンタイプ10ギガ
		else if (JFUStrConst.NET_COURSE_10G.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA8401;
		}
		// 1ギガコース Netflixパック
		else if (JFUStrConst.NET_COURSE_1G_NF.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA9201;
		}
		// 5ギガコース Netflixパック
		else if (JFUStrConst.NET_COURSE_5G_NF.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA9401;
		}
		// 10ギガコース Netflixパック
		else if (JFUStrConst.NET_COURSE_10G_NF.equals(netCourse))
		{
			// 料金プランコード
			return JFUStrConst.CD00565_PA9601;
		}

		return null;
	}

	/**
	 * ネットの料金プランを取得する。
	 * 
	 * <br>
	 * @param tkHoshikiCd 提供方式コード
	 * @param tkPrcSbtCd 提供料金種別コード
	 * @param tkHoshikiChgSbtCd 提供方式変更種別コード
	 * @param netCourse ネットコース
	 * @return 料金プランコード
	 */
	public static String getPplanCdMansionNet(String tkHoshikiCd,String tkPrcSbtCd,String tkHoshikiChgSbtCd,String netCourse)
	{
		// マンションのフロント用提供方式パターンを取得
		String fuTeikyoHoshikiPtnCd = JFUMkmInfoAddUtil.getFuTeikyoHoshikiPtnCd(tkHoshikiCd, tkPrcSbtCd);

		// 料金コースコード、料金プランコードの設定
		if (isTkHosikiChgSbtCd(tkHoshikiChgSbtCd))
		{
			// 提供方式変更の場合

			// マンションタイプ　光配線　１ギガ 
			return JFUStrConst.CD00565_PA5701;
		}
		else if (JFUStrConst.TK_HOSHIKI_PTN_GG_ENET.equals(fuTeikyoHoshikiPtnCd))
		{
			// 提供方式パターンがギガイーサの場合

			if ("1".equals(netCourse))
			{
				// 光ネットコースが「1:100Mコース」の場合

				// マンションタイプ　グローバル　１００Ｍプレミアム　イーサネット
				return JFUStrConst.CD00565_PA7001;

			}
			else if ("3".equals(netCourse))
			{
				// 光ネットコースが「3:１Ｇ」の場合

				// マンションタイプ　グローバル　１ギガ　イーサネット
				return JFUStrConst.CD00565_PA5501;
			}
		}
		else if (JFUStrConst.TK_HOSHIKI_PTN_HIKARI_HAISEN.equals(fuTeikyoHoshikiPtnCd))
		{
			// 提供方式パターンが光配線の場合

			if ("1".equals(netCourse))
			{
				// 光ネットコースが「1:100Mコース」の場合

				// マンションタイプ　光配線　１００Ｍプレミアム
				return JFUStrConst.CD00565_PA7101;

			}
			else if ("3".equals(netCourse))
			{
				// 光ネットコースが「3:１Ｇ」の場合

				// マンションタイプ　光配線　１ギガ
				return JFUStrConst.CD00565_PA5701;
			}
			else if ("6".equals(netCourse))
			{
				// 光ネットコースが「6:１０Ｇ」の場合

				// マンションタイプ　光配線　１０ギガ
				return JFUStrConst.CD00565_PA7401;
			}
		}
		else if (JFUStrConst.TK_HOSHIKI_ENET.equals(tkHoshikiCd))
		{
			// 提供方式がイーサーの場合

			// マンションタイプ　グローバル　１００Ｍ　イーサネット
			return JFUStrConst.CD00565_PA5401;
		}

		// 提供方式パターンが"VDSL"もしくは"VDSL-S"の場合
		if (JFUStrConst.TK_HOSHIKI_PTN_VDSL.equals(fuTeikyoHoshikiPtnCd) || JFUStrConst.TK_HOSHIKI_PTN_VDSLS.equals(fuTeikyoHoshikiPtnCd))
		{
			if (JFUStrConst.TK_HOSHIKI_VDSL2.equals(tkHoshikiCd))
			{
				// 提供方式がVDSL2の場合

				// マンションタイプ　グローバル　１００Ｍ　ＶＤＳＬ
				return JFUStrConst.CD00565_PA5001;

			}
			else if (JFUStrConst.TK_HOSHIKI_VDSL3.equals(tkHoshikiCd))
			{
				// 提供方式がVDSL3の場合

				// マンションタイプ　グローバル　１００Ｍ　ＶＤＳＬ
				return JFUStrConst.CD00565_PA5101;
			}
			else if (JFUStrConst.TK_HOSHIKI_VDSL4.equals(tkHoshikiCd))
			{
				// 提供方式がVDSL4の場合

				// マンションタイプ　グローバル　１００Ｍ　ＶＤＳＬ
				return JFUStrConst.CD00565_PA5201;

			}
			else if (JFUStrConst.TK_HOSHIKI_VDSL5.equals(tkHoshikiCd))
			{
				// 提供方式がVDSL5の場合

				// マンションタイプ　グローバル　１００Ｍ　ＶＤＳＬ
				return JFUStrConst.CD00565_PA5301;
			}
		}
		return null;
	}

	/**
	 * 提供方式パターンを取得する。
	 * 
	 * <br>
	 * @param tkHoshikiCd 提供方式コード
	 * @param tkPrcSbtCd 提供料金種別コード
	 * @return 提供方式パターンコード
	 */
	public static String getFuTeikyoHoshikiPtnCd(String tkHoshikiCd, String tkPrcSbtCd)
	{
		// 提供方式コードが"004"、"005"、"006" の場合は"1"(VDSL)を設定
		if (JFUStrConst.TK_HOSHIKI_VDSL2.equals(tkHoshikiCd) || JFUStrConst.TK_HOSHIKI_VDSL3.equals(tkHoshikiCd)
				|| JFUStrConst.TK_HOSHIKI_VDSL4.equals(tkHoshikiCd))
		{
			return JFUStrConst.TK_HOSHIKI_PTN_VDSL;
		}

		// 提供方式コードが"007"かつ、提供料金種別コードが"002"(VDSL-S)以外の場合は"1"(VDSL)を設定
		if (JFUStrConst.TK_HOSHIKI_VDSL5.equals(tkHoshikiCd) && !JFUStrConst.TK_PRC_SBT_CD_VDSL_S.equals(tkPrcSbtCd))
		{
			return JFUStrConst.TK_HOSHIKI_PTN_VDSL;
		}

		// 提供料金種別コードが"001"(旧VDSL-S),"002"(VDSL-S)の場合は"2"(VDSL-S)を設定
		if (JFUStrConst.TK_PRC_SBT_CD_VDSL_S.equals(tkPrcSbtCd) || JFUStrConst.TK_PRC_SBT_CD_VDSL_S_OLD.equals(tkPrcSbtCd))
		{
			return JFUStrConst.TK_HOSHIKI_PTN_VDSLS;
		}

		// 提供方式コードが"001"の場合は"3"(イーサ)を設定
		if (JFUStrConst.TK_HOSHIKI_ENET.equals(tkHoshikiCd))
		{
			return JFUStrConst.TK_HOSHIKI_PTN_ENET;
		}

		// 提供方式コードが"010"の場合は"4"(ギガイーサ)を設定
		if (JFUStrConst.TK_HOSHIKI_GIGA_ENET.equals(tkHoshikiCd))
		{
			return JFUStrConst.TK_HOSHIKI_PTN_GG_ENET;
		}

		// 提供方式コードが"008"の場合は"5"(光配線)を設定
		if (JFUStrConst.TK_HOSHIKI_HIKARI_HAISEN.equals(tkHoshikiCd))
		{
			return JFUStrConst.TK_HOSHIKI_PTN_HIKARI_HAISEN;
		}

		return JFUStrConst.EMPTY;
	}

	/**
	 * 提供方式変更種別が設定されているか判定。<br/>
	 * （料金コースと画面表示コースが異なるか判定 [例]光コンセント）
	 * 
	 * <br>
	 * @param tkHoshikiChgSbtCd 提供方式変更種別
	 * @return true：提供方式変更 ※速度表示変更
	 */
	public static boolean isTkHosikiChgSbtCd(String tkHoshikiChgSbtCd)
	{
		if (JFUStrConst.TK_HOSHIKI_CHG_SBT_CD_CONCENT.equals(tkHoshikiChgSbtCd))
		{
			// 光コンセント
			return true;
		}
		if (JFUStrConst.TK_HOSHIKI_CHG_SBT_CD_HIKARI.equals(tkHoshikiChgSbtCd))
		{
			// 光配線（全戸一括）
			return true;
		}
		return false;
	}
}
