using System;
using System.Text;

namespace V2GProtocol
{
    /// <summary>
    /// V2G 프로토콜 API - 외부 프로그램에서 사용하기 위한 간단한 인터페이스
    /// </summary>
    public static class V2GApi
    {
        /// <summary>
        /// EXI 헥스 문자열을 XML로 디코드
        /// </summary>
        /// <param name="exiHexString">EXI 형식의 헥스 문자열</param>
        /// <returns>디코드된 XML 문자열</returns>
        public static string DecodeHexToXml(string exiHexString)
        {
            try
            {
                // 헥스 문자열 정리
                exiHexString = exiHexString.Replace(" ", "").Replace("-", "").Replace("0x", "");
                
                // 헥스를 바이트 배열로 변환
                byte[] exiBytes = Helper.FromHexString(exiHexString);
                
                // EXI를 XML로 디코드
                return V2GDecoder.DecodeEXIToXML(exiBytes);
            }
            catch (Exception ex)
            {
                throw new Exception($"Failed to decode EXI: {ex.Message}", ex);
            }
        }

        /// <summary>
        /// EXI 바이트 배열을 XML로 디코드
        /// </summary>
        /// <param name="exiBytes">EXI 형식의 바이트 배열</param>
        /// <returns>디코드된 XML 문자열</returns>
        public static string DecodeBytesToXml(byte[] exiBytes)
        {
            try
            {
                return V2GDecoder.DecodeEXIToXML(exiBytes);
            }
            catch (Exception ex)
            {
                throw new Exception($"Failed to decode EXI: {ex.Message}", ex);
            }
        }

        /// <summary>
        /// XML을 EXI 헥스 문자열로 인코드
        /// </summary>
        /// <param name="xmlContent">XML 내용</param>
        /// <returns>인코드된 EXI 헥스 문자열</returns>
        public static string EncodeXmlToHex(string xmlContent)
        {
            try
            {
                // XML을 EXI로 인코드
                byte[] exiBytes = V2GDecoder.EncodeXMLToEXI(xmlContent);
                
                // 바이트 배열을 헥스 문자열로 변환
                return Helper.ToHexString(exiBytes);
            }
            catch (Exception ex)
            {
                throw new Exception($"Failed to encode XML: {ex.Message}", ex);
            }
        }

        /// <summary>
        /// XML을 EXI 바이트 배열로 인코드
        /// </summary>
        /// <param name="xmlContent">XML 내용</param>
        /// <returns>인코드된 EXI 바이트 배열</returns>
        public static byte[] EncodeXmlToBytes(string xmlContent)
        {
            try
            {
                return V2GDecoder.EncodeXMLToEXI(xmlContent);
            }
            catch (Exception ex)
            {
                throw new Exception($"Failed to encode XML: {ex.Message}", ex);
            }
        }

        /// <summary>
        /// V2G 메시지 분석 (헥스 덤프에서 V2G 메시지 추출)
        /// </summary>
        /// <param name="hexDumpData">헥스 덤프 데이터</param>
        /// <returns>V2G 메시지 정보</returns>
        public static V2GDecoder.V2GMessage AnalyzeV2GMessage(byte[] hexDumpData)
        {
            try
            {
                return V2GDecoder.DecodeMessage(hexDumpData);
            }
            catch (Exception ex)
            {
                throw new Exception($"Failed to analyze V2G message: {ex.Message}", ex);
            }
        }

        /// <summary>
        /// 헥스 파일 파싱
        /// </summary>
        /// <param name="filePath">헥스 파일 경로</param>
        /// <returns>파싱된 바이트 배열</returns>
        public static byte[] ParseHexFile(string filePath)
        {
            try
            {
                return V2GDecoder.ParseHexFile(filePath);
            }
            catch (Exception ex)
            {
                throw new Exception($"Failed to parse hex file: {ex.Message}", ex);
            }
        }
    }
}