using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows.Forms;
using Newtonsoft.Json;
using FCOMMON;

namespace Project.Web
{
    public partial class MachineBridge
    {
        #region Login API

        /// <summary>
        /// 로그인 처리 (fLogin_WB.cs의 button1_Click 로직 참고)
        /// </summary>
        public string Login(string gcode, string id, string password, bool rememberMe)
        {
            var result = new LoginResult();
            DateTime dt = DateTime.Now;

            try
            {
                if (string.IsNullOrEmpty(id))
                {
                    result.Success = false;
                    result.Message = "사용자 ID를 입력하세요.";
                    return JsonConvert.SerializeObject(result);
                }

                if (string.IsNullOrEmpty(password))
                {
                    result.Success = false;
                    result.Message = "비밀번호를 입력하세요.";
                    return JsonConvert.SerializeObject(result);
                }

                if (string.IsNullOrEmpty(gcode))
                {
                    result.Success = false;
                    result.Message = "소속 부서를 선택하세요.";
                    return JsonConvert.SerializeObject(result);
                }

                // 부서명 조회
                var deptName = DBM.ExecuteScalar($"SELECT dept FROM UserGroup WHERE gcode = '{gcode}'") ?? "";

                var encpass = Pub.MakePasswordEnc(password.Trim());

                // 개발자 계정 처리
                if (id.ToUpper().Equals("DEV"))
                {
                    if (!password.Equals("123"))
                    {
                        result.Success = false;
                        result.Message = "암호가 일치하지 않습니다.";
                        return JsonConvert.SerializeObject(result);
                    }

                    SetDevLoginInfo(gcode, deptName);
                }
                else
                {
                    // 일반 사용자 로그인 처리
                    var taGrpUser = new dsMSSQLTableAdapters.EETGW_GroupUserTableAdapter();
                    var drGrpUser = taGrpUser.GetbyID(gcode, id).FirstOrDefault();

                    if (drGrpUser == null)
                    {
                        result.Success = false;
                        result.Message = $"입력한 사용자 계정이 존재하지 않습니다.\n\n담당부서명:{deptName}\n부서코드:{gcode}\n\n접속 부서를 확인하시고 관리자 문의 하세요";
                        return JsonConvert.SerializeObject(result);
                    }

                    if (drGrpUser.level == 0)
                    {
                        result.Success = false;
                        result.Message = "해당 계정이 활성화되지 않았습니다.\n계정 담당자 문의하세요";
                        return JsonConvert.SerializeObject(result);
                    }

                    // 사용자 테이블에서 암호 확인
                    var taUser = new dsMSSQLTableAdapters.UsersTableAdapter();
                    var drUser = taUser.GetID(id).FirstOrDefault();

                    if (drUser == null)
                    {
                        result.Success = false;
                        result.Message = $"입력한 사용자 계정이 존재하지 않습니다.\n\n담당부서명:{deptName}\n부서코드:{gcode}\n\n접속 부서를 확인하시고 관리자 문의 하세요";
                        return JsonConvert.SerializeObject(result);
                    }

                    if (!drUser.password.Equals(encpass))
                    {
                        result.Success = false;
                        result.Message = "암호가 일치하지 않습니다.\n암호를 분실했을 경우에는 계정담당자에 초기화를 요청 하세요";
                        return JsonConvert.SerializeObject(result);
                    }

                    // 버전 체크
                    var MaxVersion = DBM.GetMaxVersion();
                    if (!MaxVersion.isEmpty())
                    {
                        var curversion = Application.ProductVersion;
                        var verchk = curversion.CompareTo(MaxVersion);
                        if (verchk < 0)
                        {
                            result.VersionWarning = "현재 구 버젼을 사용하고 있습니다.\n업데이트를 진행 하고 사용하시기 바랍니다";
                        }
                    }

                    // 로그인 정보 설정
                    var gperm = DBM.ExecuteScalar($"SELECT ISNULL(permission,0) FROM UserGroup WHERE gcode = '{gcode}'");

                    info.Login.no = drUser.id;
                    info.Login.nameK = drUser.name;
                    info.Login.dept = deptName;
                    info.Login.level = drGrpUser.level;
                    info.Login.email = drUser.email;
                    info.Login.nameE = drUser.nameE;
                    info.Login.hp = drUser.hp;
                    info.Login.tel = drUser.tel;
                    info.Login.title = drUser.dept + "(" + drUser.grade + ")";
                    info.NotShowJobReportview = Pub.setting.NotShowJobreportPRewView;
                    info.Login.gcode = gcode;
                    info.Login.process = drGrpUser.Process;
                    info.Login.permission = 0;
                    info.Login.gpermission = int.Parse(gperm);
                    info.ShowBuyerror = Pub.setting.Showbuyerror;
                }

                // 설정 저장 (rememberMe 처리)
                if (rememberMe)
                {
                    var idlist = new List<string> { id.Trim() };
                    var vuserlist = "";
                    foreach (var item in idlist)
                        vuserlist += ";" + item;

                    Pub.setting.lastid = vuserlist;
                    Pub.setting.lastdpt = deptName;
                    Pub.setting.lastgcode = gcode;
                    Pub.setting.Save();
                }

                // 로그인 정보 기록
                AddLoginInfo();

                // 자동 업무일지 생성
                Pub.MakeAutoJobReportbyLogin();
                Pub.MakeAutoJobReportByAuto();

                info.Login.loginusetime = (DateTime.Now - dt).TotalMilliseconds;

                // fMain의 로그인 완료 후처리 호출
                CallMainFormLoginCompleted();

                result.Success = true;
                result.Message = "로그인 성공";
                result.RedirectUrl = "/DashBoard/index.html";
                result.UserName = info.Login.nameK;
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Message = "데이터베이스 조회 실패. 다음 오류 메세지를 참고하세요.\n\n" + ex.Message;
            }

            return JsonConvert.SerializeObject(result);
        }

        /// <summary>
        /// fMain의 OnLoginCompleted() 호출
        /// </summary>
        private void CallMainFormLoginCompleted()
        {
            try
            {
                // Application.OpenForms에서 fMain 인스턴스 찾기
                foreach (Form form in Application.OpenForms)
                {
                    if (form is fMain mainForm)
                    {
                        // UI 스레드에서 실행
                        if (mainForm.InvokeRequired)
                        {
                            mainForm.Invoke(new Action(() => mainForm.OnLoginCompleted()));
                        }
                        else
                        {
                            mainForm.OnLoginCompleted();
                        }
                    }
                    else if (form is Dialog.fDashboard dashForm)
                    {
                        if (dashForm.InvokeRequired)
                        {
                            dashForm.Invoke(new Action(() => dashForm.RefreshPage()));
                        }
                        else
                        {
                            dashForm.RefreshPage();
                        }
                    }

                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"OnLoginCompleted 호출 오류: {ex.Message}");
            }
        }

        /// <summary>
        /// 개발자 로그인 정보 설정
        /// </summary>
        private void SetDevLoginInfo(string gcode, string deptName)
        {
            var gperm = DBM.ExecuteScalar($"SELECT ISNULL(permission,0) FROM UserGroup WHERE gcode = '{gcode}'");

            info.Login.no = "dev";
            info.Login.nameK = "개발자";
            info.Login.dept = deptName;
            info.Login.level = 10;
            info.Login.email = "";
            info.Login.nameE = "DEVELOPER";
            info.Login.hp = "";
            info.Login.tel = "";
            info.Login.title = "업무일지 개발자";
            info.NotShowJobReportview = Pub.setting.NotShowJobreportPRewView;
            info.Login.gcode = gcode;
            info.Login.process = "개발자";
            info.Login.permission = 0;
            info.Login.gpermission = int.Parse(gperm);
            info.ShowBuyerror = Pub.setting.Showbuyerror;
        }

        /// <summary>
        /// 로그인 정보 기록
        /// </summary>
        private void AddLoginInfo()
        {
            string ip = string.Empty;
            string hostname = Dns.GetHostName();
            string fullname = Dns.GetHostEntry("").HostName;

            var host = Dns.GetHostEntry(hostname);
            foreach (IPAddress r in host.AddressList)
            {
                string str = r.ToString();
                if (!string.IsNullOrEmpty(str) && str.StartsWith("10."))
                {
                    ip = str;
                    break;
                }
            }

            if (string.IsNullOrEmpty(ip) || string.IsNullOrEmpty(hostname)) return;

            try
            {
                var ta = new dsMSSQLTableAdapters.EETGW_LoginInfoTableAdapter();
                ta.Insert(info.Login.no, DateTime.Now, ip, fullname, info.Login.no, DateTime.Now);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        /// <summary>
        /// 현재 로그인 상태 확인
        /// </summary>
        public string CheckLoginStatus()
        {
            var isLoggedIn = !string.IsNullOrEmpty(info.Login.no);
            var result = new
            {
                Success = true,
                IsLoggedIn = isLoggedIn,
                User = isLoggedIn ? new
                {
                    Id = info.Login.no,
                    Name = info.Login.nameK,
                    NameE = info.Login.nameE,
                    Dept = info.Login.dept,
                    Email = info.Login.email,
                    Level = info.Login.level,
                    Gcode = info.Login.gcode
                } : null
            };
            return JsonConvert.SerializeObject(result);
        }

        /// <summary>
        /// 그룹 목록 조회
        /// </summary>
        public string GetUserGroups()
        {
            var dt = DBM.GetUserGroups();
            return JsonConvert.SerializeObject(dt, new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore
            });
        }

        /// <summary>
        /// 이전 로그인 정보 조회
        /// </summary>
        public string GetPreviousLoginInfo()
        {
            var result = new
            {
                Success = true,
                Data = new
                {
                    LastGcode = Pub.setting.lastgcode ?? "",
                    LastDept = Pub.setting.lastdpt ?? "",
                    LastId = Pub.setting.lastid?.TrimStart(';').Split(';').FirstOrDefault() ?? ""
                }
            };
            return JsonConvert.SerializeObject(result);
        }

        /// <summary>
        /// 로그아웃 처리
        /// </summary>
        public string Logout()
        {
            try
            {
                // 로그인 정보 초기화
                info.Login.no = "";
                info.Login.nameK = "";
                info.Login.nameE = "";
                info.Login.dept = "";
                info.Login.email = "";
                info.Login.level = 0;
                info.Login.gcode = "";
                info.Login.hp = "";
                info.Login.tel = "";
                info.Login.title = "";
                info.Login.process = "";
                info.Login.permission = 0;
                info.Login.gpermission = 0;

                // fMain의 CloseAllForm 호출
                CallMainFormCloseAllForm();

                return JsonConvert.SerializeObject(new { Success = true, Message = "로그아웃 되었습니다." });
            }
            catch (Exception ex)
            {
                return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
            }
        }

        /// <summary>
        /// fMain의 CloseAllForm() 호출
        /// </summary>
        private void CallMainFormCloseAllForm()
        {
            try
            {
                foreach (Form form in Application.OpenForms)
                {
                    if (form is fMain mainForm)
                    {
                        if (mainForm.InvokeRequired)
                        {
                            mainForm.Invoke(new Action(() => mainForm.CloseAllFormPublic()));
                        }
                        else
                        {
                            mainForm.CloseAllFormPublic();
                        }
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"CloseAllForm 호출 오류: {ex.Message}");
            }
        }

        #endregion
    }
}
