using LevelCode.License.DataAccess;
using LevelCode.License.Models;
using LevelCode.License.Models.Enums;
using System;
using System.Collections.Generic;

namespace LevelCode.License.Business
{
    public class LicencaMaquinaService
    {
        private readonly LicencaMaquinaDAL _maquinaDal;

        public LicencaMaquinaService(LicencaMaquinaDAL maquinaDal)
        {
            _maquinaDal = maquinaDal;
        }

        // =========================
        // VALIDAR / REGISTRAR MÁQUINA
        // =========================
        public bool ValidarOuRegistrarMaquina(
            int licencaId,
            string hwid,
            string hwidHash,
            int limiteMaquinas,
            out string mensagem)
        {
            mensagem = "";

            if (string.IsNullOrWhiteSpace(hwidHash))
            {
                mensagem = "HWID inválido.";
                return false;
            }

            // Verifica se a máquina já existe
            var maquina = _maquinaDal.BuscarPorLicencaEHash(licencaId, hwidHash);

            if (maquina != null)
            {
                if (maquina.Status != (int)StatusMaquinaEnum.Ativa)
                {
                    mensagem = "Máquina bloqueada para esta licença.";
                    return false;
                }

                _maquinaDal.AtualizarUltimoUso(maquina.Id);
                mensagem = "Máquina já registrada.";
                return true;
            }

            // Nova máquina → verifica limite
            int totalAtivas = _maquinaDal.ContarMaquinasAtivas(licencaId);

            if (totalAtivas >= limiteMaquinas)
            {
                mensagem = "Limite de máquinas atingido.";
                return false;
            }

            // Registrar nova máquina
            ModeloLicencaMaquina nova = new ModeloLicencaMaquina
            {
                LicencaId = licencaId,
                HWID = hwid,
                HWID_Hash = hwidHash,
                DataAtivacao = DateTime.Now,
                Status = (int)StatusMaquinaEnum.Ativa
            };

            _maquinaDal.Inserir(nova);

            mensagem = "Máquina registrada com sucesso.";
            return true;
        }

        public List<ModeloLicencaMaquina> ListarMaquinas(int licencaId)
        {
            return _maquinaDal.ListarPorLicenca(licencaId);
        }

        public void Desativar(int id)
        {
            _maquinaDal.DesativarMaquina(id);
        }
        // =========================
        // BLOQUEAR MÁQUINA
        // =========================
        public void BloquearMaquina(int idMaquina)
        {
            _maquinaDal.AtualizarStatus(idMaquina, (int)StatusMaquinaEnum.Bloqueada);
        }

        // =========================
        // ATIVAR MÁQUINA
        // =========================
        public void AtivarMaquina(int idMaquina)
        {
            _maquinaDal.AtualizarStatus(idMaquina, (int)StatusMaquinaEnum.Ativa);
        }
    }
}
