using SmartAquaViewer.DataAnalysis;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SmartAquaViewer.DataAnalisys
{


    internal class AquarDataControl
    {
        private AQUA_DATA_CONTROL_STATE state = AQUA_DATA_CONTROL_STATE.IDLE;
        private readonly IWaterQuality iwaterQuality;
        private CancellationTokenSource? cts;

        AppDbContext db = new AppDbContext();


        public AquarDataControl(IWaterQuality iwaterQuality)
        {
            this.iwaterQuality = iwaterQuality;
        }

        public AQUA_DATA_CONTROL_STATE GetState() => state;

        /// <summary>
        /// 파일 파싱 시작
        /// </summary>
        public void ParseFile(string filePath)
        {
            // --- 동기 처리 구간 ---
            if (state != AQUA_DATA_CONTROL_STATE.IDLE &&
                state != AQUA_DATA_CONTROL_STATE.PROCESS_COMPLETED)
            {
                iwaterQuality.OnError("illegal state error : " + state);
                return;
            }

            state = AQUA_DATA_CONTROL_STATE.PROCESSING;
            cts = new CancellationTokenSource();

            // --- 비동기 처리 구간 ---
            Task.Run(async () =>
            {
                try
                {
                    var fileInfo = new FileInfo(filePath);
                    long totalBytes = fileInfo.Length;
                    long processedBytes = 0;

                    using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                    using (var reader = new StreamReader(fs))
                    {
                        string? line;
                        while ((line = await reader.ReadLineAsync()) != null)
                        {
                            cts.Token.ThrowIfCancellationRequested();

                            processedBytes += Encoding.UTF8.GetByteCount(line + Environment.NewLine);
                            double percent = (double)processedBytes / totalBytes * 100.0;

                            // TODO: 라인 파싱 로직
                            WaterQualityVO vo = new();
                            //vo.PH = 10.5;
                            vo.RecordedTime = DateTime.Now;
                            iwaterQuality.OnParsed(vo);

                            db.Add(vo);

                            iwaterQuality.OnProgress(percent);
                        }
                    }

                    state = AQUA_DATA_CONTROL_STATE.PROCESS_COMPLETED;
                    iwaterQuality.OnCompleted();
                }
                catch (OperationCanceledException)
                {
                    state = AQUA_DATA_CONTROL_STATE.CANCELLED;
                    iwaterQuality.OnCancelled();
                }
                catch (Exception ex)
                {
                    state = AQUA_DATA_CONTROL_STATE.ERROR;
                    iwaterQuality.OnError("파일 처리 중 오류 발생: " + ex.Message);
                }
            });
        }

        /// <summary>
        /// 처리 중단 요청
        /// </summary>
        public void Cancel()
        {
            if (state == AQUA_DATA_CONTROL_STATE.PROCESSING && cts != null)
            {
                cts.Cancel();
            }
        }
    }


}
