from sqlalchemy import Column, Integer, String, TIMESTAMP, func, TEXT, ForeignKey, Enum, Boolean, Date
from sqlalchemy.orm import relationship
from backend.database import Base

class Sector(Base):
    __tablename__ = 'utrau_sectores'
    id_sector = Column(Integer, primary_key=True, autoincrement=True)
    codigo = Column(String(20), nullable=False)
    nombre = Column(String(100), nullable=False)

class Empresa(Base):
    __tablename__ = 'utrau_empresas'
    id_empresa = Column(Integer, primary_key=True, autoincrement=True)
    nombre_fantasia = Column(String(150), nullable=False)
    nombre_fiscal = Column(String(200), nullable=False)
    rut = Column(String(20), nullable=True)
    direccion = Column(String(255), nullable=True)
    localidad = Column(String(100), nullable=True)
    departamento = Column(String(100), nullable=True)
    mail_oficial = Column(String(100), nullable=True)
    cant_trabajadores = Column(Integer, default=0)
    tipo = Column(Enum('Empresa', 'MTSS/IGTSS', 'Judicial', 'Sindicato', 'Otro'), default='Empresa')
    estado = Column(Enum('Activa', 'En Conflicto', 'Archivada'), default='Activa')
    contactos = relationship("Contacto", back_populates="empresa")

class Contacto(Base):
    __tablename__ = 'utrau_contactos'
    id_contacto = Column(Integer, primary_key=True, autoincrement=True)
    id_empresa = Column(Integer, ForeignKey('utrau_empresas.id_empresa'), nullable=False)
    nombre = Column(String(150), nullable=False)
    cargo = Column(String(100), nullable=True)
    celular_whatsapp = Column(String(50), nullable=True)
    email = Column(String(100), nullable=True)
    empresa = relationship("Empresa", back_populates="contactos")

class Usuario(Base):
    __tablename__ = 'utrau_usuarios'
    id_usuario = Column(Integer, primary_key=True, autoincrement=True)
    alias = Column(String(50), unique=True, nullable=False)
    nombre_completo = Column(String(150), nullable=False)
    pin_firma = Column(String(255), nullable=False)
    rol = Column(Integer, default=1)
    estado = Column(Enum('ACTIVO', 'INACTIVO'), default='ACTIVO')
    tipo_documento = Column(Enum('CI', 'PASAPORTE', 'OTROS'), default='CI')
    cedula_identidad = Column(String(20), nullable=True) 
    fecha_nacimiento = Column(Date, nullable=True)
    whatsapp = Column(String(20), nullable=True)
    celular = Column(String(20), nullable=True)
    email = Column(String(100), nullable=True)
    fecha_ingreso = Column(Date, nullable=True)
    id_sector = Column(Integer, ForeignKey('utrau_sectores.id_sector'), nullable=True)
    id_empresa = Column(Integer, ForeignKey('utrau_empresas.id_empresa'), nullable=True)
    tipo_contrato = Column(Enum('MENSUAL','JORNALERO','ZAFRAL','OTROS'), default='MENSUAL')
    path_cedula_frente = Column(String(255), nullable=True)
    path_cedula_atras = Column(String(255), nullable=True)
    path_foto = Column(String(255), nullable=True)
    path_firma = Column(String(255), nullable=True)
    version = Column(Integer, nullable=False, default=1)
    ultima_conexion = Column(TIMESTAMP, server_default=func.now(), onupdate=func.now())
    fecha_creacion = Column(TIMESTAMP, server_default=func.now())
    id_creador = Column(Integer, nullable=True)
    id_editor = Column(Integer, nullable=True)
    tema_visual = Column(Integer, default=0)
    sector = relationship("Sector")
    empresa = relationship("Empresa")

class TerminalActiva(Base):
    __tablename__ = 'utrau_terminales_activas'
    uuid_terminal = Column(String(100), primary_key=True)
    nombre_equipo = Column(String(100), nullable=True)
    id_usuario_actual = Column(Integer, ForeignKey('utrau_usuarios.id_usuario'))
    estado = Column(Enum('CONECTADO', 'DESCONECTADO', 'PENDIENTE'), default='PENDIENTE')
    ultima_conexion = Column(TIMESTAMP, server_default=func.now(), onupdate=func.now())
    usuario = relationship("Usuario")

class Cargo(Base):
    __tablename__ = 'utrau_cargos'
    id_cargo = Column(Integer, primary_key=True, autoincrement=True)
    nombre_cargo = Column(String(100), nullable=False)
    es_ejecutivo = Column(Boolean, default=False)
    orden = Column(Integer, default=0)
    version = Column(Integer, nullable=False, default=1)

class Asignacion(Base):
    __tablename__ = 'utrau_asignaciones'
    id_asignacion = Column(Integer, primary_key=True, autoincrement=True)
    id_usuario = Column(Integer, ForeignKey('utrau_usuarios.id_usuario'), nullable=False)
    id_cargo = Column(Integer, ForeignKey('utrau_cargos.id_cargo'), nullable=False)
    fecha_inicio = Column(Date, nullable=False)
    fecha_fin = Column(Date, nullable=True)
    version = Column(Integer, nullable=False, default=1)

class Grupo(Base):
    __tablename__ = 'utrau_grupos'
    id_grupo = Column(Integer, primary_key=True, autoincrement=True)
    nombre_grupo = Column(String(150), nullable=False)
    id_padre = Column(Integer, ForeignKey('utrau_grupos.id_grupo'), nullable=True)

class UsuarioGrupo(Base):
    __tablename__ = 'utrau_usuarios_grupos'
    id_usuario = Column(Integer, ForeignKey('utrau_usuarios.id_usuario'), primary_key=True)
    id_grupo = Column(Integer, ForeignKey('utrau_grupos.id_grupo'), primary_key=True)

class Conflicto(Base):
    __tablename__ = 'utrau_conflictos'
    id_conflicto = Column(Integer, primary_key=True, autoincrement=True)
    titulo = Column(String(255), nullable=False)
    id_empresa = Column(Integer, ForeignKey('utrau_empresas.id_empresa'), nullable=False)
    ambito = Column(Enum('Interno','Bipartito','Tripartito','Judicial'), default='Bipartito')
    estado = Column(Enum('Activo', 'Archivado'), default='Activo')
    esperando_a = Column(Enum('UTRAU', 'Empresa', 'MTSS/Judicial'), default='UTRAU')
    id_responsable = Column(Integer, ForeignKey('utrau_usuarios.id_usuario'), nullable=False)
    id_conflicto_padre = Column(Integer, ForeignKey('utrau_conflictos.id_conflicto'), nullable=True)
    fecha_creacion = Column(TIMESTAMP, nullable=False, server_default=func.now())
    version = Column(Integer, default=1)

class ConflictoParticipante(Base):
    __tablename__ = 'utrau_conflictos_participantes'
    id_conflicto = Column(Integer, ForeignKey('utrau_conflictos.id_conflicto'), primary_key=True)
    id_usuario = Column(Integer, ForeignKey('utrau_usuarios.id_usuario'), primary_key=True)

class Bitacora(Base):
    __tablename__ = 'utrau_conflictos_bitacora'
    id_bitacora = Column(Integer, primary_key=True, autoincrement=True)
    id_conflicto = Column(Integer, ForeignKey('utrau_conflictos.id_conflicto'), nullable=False)
    id_usuario = Column(Integer, ForeignKey('utrau_usuarios.id_usuario'), nullable=False)
    descripcion = Column(TEXT, nullable=False)
    timestamp = Column(TIMESTAMP, nullable=False, server_default=func.now())

class ConflictoDoc(Base):
    __tablename__ = 'utrau_conflictos_docs'
    id_doc = Column(Integer, primary_key=True, autoincrement=True)
    id_conflicto = Column(Integer, ForeignKey('utrau_conflictos.id_conflicto'), nullable=False)
    id_usuario = Column(Integer, ForeignKey('utrau_usuarios.id_usuario'), nullable=False)
    tipo_documento = Column(Enum('Denuncia','Acta','Recibo','Respuesta','Evidencia','Otro'), default='Otro')
    descripcion_corta = Column(String(255), nullable=False)
    ruta_archivo = Column(String(255), nullable=False)
    fecha_carga = Column(TIMESTAMP, nullable=False, server_default=func.now())

class AuditoriaHistorica(Base):
    __tablename__ = 'utrau_auditoria_historica'
    id_auditoria = Column(Integer, primary_key=True, autoincrement=True)
    tabla_afectada = Column(String(50), nullable=False)
    id_registro = Column(Integer, nullable=False)
    accion = Column(Enum('INSERT', 'UPDATE', 'DELETE'), nullable=False)
    datos_antes = Column(TEXT, nullable=True)
    datos_despues = Column(TEXT, nullable=True)
    id_usuario = Column(Integer, nullable=False)
    timestamp = Column(TIMESTAMP, nullable=False, server_default=func.now())

class Log(Base):
    __tablename__ = 'utrau_logs'
    id_log = Column(Integer, primary_key=True, autoincrement=True)
    modulo = Column(String(100), nullable=True)
    evento = Column(String(50), nullable=True)
    descripcion = Column(TEXT, nullable=True)
    id_usuario = Column(Integer, nullable=True)
    uuid_terminal = Column(String(100), nullable=True)
    fecha_hora = Column(TIMESTAMP, nullable=False, server_default=func.now())