using Levelcode_licenseCliente.DataAccess;
using Levelcode_licenseCliente.Models;
using Levelcode_licenseCliente.Security;
using System;
using System.Configuration;
using System.IO;
using System.Text.Json;

namespace Levelcode_licenseCliente.Services
{
    public class AtivacaoService
    {
        private readonly string _connectionString;

        public AtivacaoService(string connectionString)
        {
            _connectionString = connectionString;
        }

        public object HwidService { get; private set; }

        public ModeloLicenca Ativar(string caminhoArquivoLicenca, string caminhoPublicKey)
        {
            if (!File.Exists(caminhoArquivoLicenca))
                throw new Exception("Arquivo de licença não encontrado.");

            if (!File.Exists(caminhoPublicKey))
                throw new Exception("Chave pública não encontrada.");

            // 🔓 Ler chave pública
            string chavePublica = File.ReadAllText(caminhoPublicKey);

            // 🔐 Validar arquivo .key (assinatura RSA)
            LicensePayload payload = LicenseEngine.ValidarArquivoKey(
                caminhoArquivoLicenca,
                chavePublica);

            if (payload == null)
                throw new Exception("Licença inválida.");

            // 🔑 Buscar licença no banco
            LicencaClienteDAL licencaDal =
                new LicencaClienteDAL(_connectionString);

            ModeloLicenca licenca =
                licencaDal.BuscarPorLicenseKey(payload.Key);

            if (licenca == null)
                throw new Exception("Licença não encontrada ou inativa.");

            // ⏳ Verificar expiração
            if (licenca.ExpiraEm.HasValue &&
                licenca.ExpiraEm.Value < DateTime.Now)
                throw new Exception("Licença expirada.");

            // 🖥️ Gerar HWID
            string hwid = Levelcode_licenseCliente.Security.HwidService.ObterHwid();

            // 🔢 Verificar máquinas
            LicencaMaquinaClienteDAL maquinaDal =
                new LicencaMaquinaClienteDAL(_connectionString);

            bool jaRegistrada =
                maquinaDal.MaquinaJaRegistrada(licenca.IdLicenca, hwid);

            if (!jaRegistrada)
            {
                int usadas =
                    maquinaDal.ContarMaquinasAtivas(licenca.IdLicenca);

                if (usadas >= licenca.LimiteMaquinas)
                    throw new Exception(
                        "Limite de máquinas atingido para esta licença.");

                // 📝 Registrar máquina
                maquinaDal.RegistrarMaquina(licenca.IdLicenca, hwid);
            }

            // ✅ Ativação OK
            return licenca;
        }

        // 💾 Salvar ativação local (opcional, mas recomendado)
        public void SalvarAtivacaoLocal(ModeloLicenca licenca)
        {
            string json = JsonSerializer.Serialize(licenca);

            File.WriteAllText(
                Path.Combine(
                    AppDomain.CurrentDomain.BaseDirectory,
                    "licenca_ativada.json"),
                json);
        }

        public bool SistemaEstaAutorizado()
        {
            string hwid = Levelcode_licenseCliente.Security.HwidService.ObterHwid();
            string conn = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
            using (var db = new DbConexao())
            {
                var licencaDal = new LicencaClienteDAL(conn);
                var maquinaDal = new LicencaMaquinaClienteDAL(conn);

                // busca licença ativa (simplificado)
                ModeloLicenca licenca = licencaDal.BuscarLicencaAtiva();

                if (licenca == null)
                    return false;

                // verifica se este HWID está autorizado
                return maquinaDal.MaquinaJaRegistrada(
                    licenca.IdLicenca,
                    hwid);
            }
        }

    }
}
