"""
Modelos SQLAlchemy de LicenciasMiG.

Apunta a la BD compartida con el panel viejo (LicenciasMIG en SQL Server VPS):
  - Solicitudes       -> nueva (creada por migrations\\001_create_solicitudes.sql)
  - Usuarios          -> ya existe, reusada para login
  - LicenciasEmpresas -> ya existe, se INSERTA al aprobar una solicitud
  - Empresas          -> ya existe, solo lectura para hidratar datos al aprobar
"""
from __future__ import annotations

from datetime import datetime

from flask_login import UserMixin
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import check_password_hash, generate_password_hash


db = SQLAlchemy()


class Solicitud(db.Model):
    __tablename__ = 'Solicitudes'

    SolicitudID         = db.Column(db.Integer, primary_key=True, autoincrement=True)
    NIT                 = db.Column(db.String(50),  nullable=False, index=True)
    NombreEmpresa       = db.Column(db.String(255))
    NombreComercial     = db.Column(db.String(255))
    Direccion           = db.Column(db.String(500))
    Telefono            = db.Column(db.String(50))
    Celular             = db.Column(db.String(50))
    Departamento        = db.Column(db.String(100))
    Ciudad              = db.Column(db.String(100))
    Responsable         = db.Column(db.String(255))
    TelefonoResponsable = db.Column(db.String(50))
    CorreoResponsable   = db.Column(db.String(255))
    Motivo              = db.Column(db.String(1000))
    LicenciaTemporal    = db.Column(db.String(2),  nullable=False, default='NO')
    ClaveProducto       = db.Column(db.UnicodeText, nullable=False)
    ClaveMes            = db.Column(db.UnicodeText)
    NombreEquipo        = db.Column(db.String(200))
    OSVersion           = db.Column(db.String(255))
    Modulo              = db.Column(db.String(50), nullable=False, default='MIG')

    FechaSolicitud      = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    Estado              = db.Column(db.String(20), nullable=False, default='Pendiente')
    FechaResolucion     = db.Column(db.DateTime)
    UsuarioAprobador    = db.Column(db.String(100))
    Observaciones       = db.Column(db.String(2000))
    FechaVencimiento    = db.Column(db.DateTime)

    IpCliente           = db.Column(db.String(45))

    def to_dict(self):
        return {
            'SolicitudID':         self.SolicitudID,
            'NIT':                 self.NIT,
            'NombreEmpresa':       self.NombreEmpresa,
            'NombreComercial':     self.NombreComercial,
            'Direccion':           self.Direccion,
            'Telefono':            self.Telefono,
            'Celular':             self.Celular,
            'Departamento':        self.Departamento,
            'Ciudad':              self.Ciudad,
            'Responsable':         self.Responsable,
            'TelefonoResponsable': self.TelefonoResponsable,
            'CorreoResponsable':   self.CorreoResponsable,
            'Motivo':              self.Motivo,
            'LicenciaTemporal':    self.LicenciaTemporal,
            'ClaveProducto':       self.ClaveProducto,
            'ClaveMes':            self.ClaveMes,
            'NombreEquipo':        self.NombreEquipo,
            'OSVersion':           self.OSVersion,
            'Modulo':              self.Modulo,
            'FechaSolicitud':      self.FechaSolicitud.strftime('%Y-%m-%d %H:%M:%S') if self.FechaSolicitud else None,
            'Estado':              self.Estado,
            'FechaResolucion':     self.FechaResolucion.strftime('%Y-%m-%d %H:%M:%S') if self.FechaResolucion else None,
            'UsuarioAprobador':    self.UsuarioAprobador,
            'Observaciones':       self.Observaciones,
            'FechaVencimiento':    self.FechaVencimiento.strftime('%Y-%m-%d %H:%M:%S') if self.FechaVencimiento else None,
            'IpCliente':           self.IpCliente,
        }


class Empresa(db.Model):
    __tablename__ = 'Empresas'

    EmpresaID          = db.Column(db.Integer, primary_key=True, autoincrement=True)
    nit                = db.Column(db.String(50),  nullable=False, unique=True, index=True)
    razonsocial        = db.Column(db.String(200), index=True)
    nombrecomercial    = db.Column(db.String(200), index=True)
    direccion          = db.Column(db.String(200))
    telefono           = db.Column(db.String(50))
    celular            = db.Column(db.String(50))
    mensualidad        = db.Column(db.Boolean, default=False, nullable=False)
    regulariza         = db.Column(db.Boolean, default=False, nullable=False)
    tipotpv            = db.Column(db.String(30))
    fecharegistro      = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
    fechaactualizacion = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
    claveproducto      = db.Column(db.UnicodeText)
    nombreequipo       = db.Column(db.UnicodeText)
    osversion          = db.Column(db.UnicodeText)


class LicenciaEmpresa(db.Model):
    __tablename__ = 'LicenciasEmpresas'

    LicenciaID        = db.Column(db.Integer, primary_key=True, autoincrement=True)
    nit               = db.Column(db.String(50), nullable=False, index=True)
    razonsocial       = db.Column(db.String(200))
    nombrecomercial   = db.Column(db.String(200))
    direccion         = db.Column(db.String(200))
    telefono          = db.Column(db.String(50))
    celular           = db.Column(db.String(50))
    iddepartamento    = db.Column(db.String(10))
    idciudad          = db.Column(db.String(10))
    licenciatemporal  = db.Column(db.Boolean, default=False, nullable=False)
    fecharegistro     = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
    responsable       = db.Column(db.String(500))
    correoresponsable = db.Column(db.String(500))
    telefonoponsable  = db.Column(db.String(500))
    motivolicencia    = db.Column(db.String(500))
    claveproducto     = db.Column(db.UnicodeText)
    nombreequipo      = db.Column(db.UnicodeText)
    osversion         = db.Column(db.UnicodeText)
    clavemes          = db.Column(db.String(500), index=True)
    licenciaactiva    = db.Column(db.Boolean, default=True,  nullable=False)
    bloquearlicencia  = db.Column(db.Boolean, default=False, nullable=False)


class Usuario(UserMixin, db.Model):
    __tablename__ = 'Usuarios'

    UsuarioID      = db.Column(db.Integer, primary_key=True, autoincrement=True)
    Username       = db.Column(db.String(50), nullable=False, unique=True)
    PasswordHash   = db.Column(db.String(255), nullable=False)
    NombreCompleto = db.Column(db.String(200))
    Email          = db.Column(db.String(100))
    Rol            = db.Column(db.String(50), default='Admin', nullable=False)
    Activo         = db.Column(db.Boolean, default=True, nullable=False)
    FechaCreacion  = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
    UltimoAcceso   = db.Column(db.DateTime)

    def set_password(self, password: str) -> None:
        self.PasswordHash = generate_password_hash(password)

    def check_password(self, password: str) -> bool:
        return check_password_hash(self.PasswordHash, password)

    def get_id(self):
        return str(self.UsuarioID)
