from django.test import TestCase, Client
from django.urls import reverse
from django.utils import timezone
from datetime import datetime

from .models import Cuenta, Movimiento, Categoria
from reymotausers.models import ReyMotaUser
from django.conf import settings

import logging

logger = logging.getLogger(__name__)

class FinanzasViewsTestCase(TestCase):
    def setUp(self):
        # Crear un usuario de prueba
        self.user = ReyMotaUser.objects.create_user(email='testuser@test.com', password='testpass')
        self.client = Client()
        self.client.login(email='testuser@test.com', password='testpass')

        # Crear dos cuentas de prueba
        self.cuenta_origen = Cuenta.objects.create(nombre='Cuenta de Prueba origen', usuario=self.user, saldo_inicial=1000)
        self.cuenta_destino = Cuenta.objects.create(nombre='Cuenta de Prueba destino', usuario=self.user, saldo_inicial=1000)        

        # Crear una categoría de prueba
        self.categoria = Categoria.objects.create(nombre='Categoría de Prueba')

        # Crear un movimiento de prueba
        self.movimiento = Movimiento.objects.create(
            cuenta_origen=self.cuenta_origen,
            cuenta_destino=self.cuenta_destino,
            categoria=self.categoria,
            usuario=self.user,
            monto=100,
            fecha=timezone.now(),
            descripcion='Movimiento de Prueba'
        )

    def test_dashboard_view(self):
        response = self.client.get(reverse('dashboard'))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, 'Cuenta de Prueba')
        self.assertContains(response, 'Movimiento de Prueba')

    def test_agregar_movimiento_view(self):
        response = self.client.post(reverse('agregar_movimiento'), {
            'cuenta_origen': self.cuenta_origen.id,
            'cuenta_destino': self.cuenta_destino.id,
            'categoria': self.categoria.id,
            'monto': 200,
            'fecha': datetime.now().date(),
            'descripcion': 'Nuevo Movimiento'
        })
        self.assertEqual(response.status_code, 302)  # Redirección después de agregar
        self.assertTrue(Movimiento.objects.filter(descripcion='Nuevo Movimiento').exists())

    def test_editar_movimiento_view(self):
        response = self.client.post(reverse('editar_movimiento', args=[self.movimiento.id]), {
            'cuenta_origen': self.cuenta_origen.id,
            'cuenta_destino': self.cuenta_destino.id,
            'categoria': self.categoria.id,
            'monto': 150,
            'fecha': datetime.now().date(),
            'descripcion': 'Movimiento Editado'
        })
        self.assertEqual(response.status_code, 302)  # Redirección después de editar
        self.movimiento.refresh_from_db()
        self.assertEqual(self.movimiento.monto, 150)
        self.assertEqual(self.movimiento.descripcion, 'Movimiento Editado')

    def test_eliminar_movimiento_view(self):
        response = self.client.post(reverse('eliminar_movimiento', args=[self.movimiento.id]))
        self.assertEqual(response.status_code, 302)  # Redirección después de eliminar
        self.assertFalse(Movimiento.objects.filter(id=self.movimiento.id).exists())

    def test_listar_cuentas_view(self):
        response = self.client.get(reverse('listar_cuentas'))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, 'Cuenta de Prueba')

    def test_informe_cuenta_view(self):
        response = self.client.get(reverse('informe_cuenta') + f'?cuenta_id={self.cuenta_origen.id}&fecha_inicio=2023-01-01&fecha_fin=2023-12-31')
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, 'Cuenta de Prueba origen')

    def test_informe_cuenta_pdf_view(self):
        
        # http://fdev.reymota.es/cuentas/informe/pdf/?cuenta_id=383&fecha_inicio=2025-11-01&fecha_fin=2025-11-30
        
        response = self.client.get(reverse('informe_cuenta_pdf') + f'?cuenta_id={self.cuenta_origen.id}&fecha_inicio=2023-01-01&fecha_fin=2023-12-31')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response['Content-Type'], 'application/pdf')

    def test_resumen_saldos_mensuales_view(self):
        response = self.client.get(reverse('resumen_saldos_mensuales'))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, 'Cuenta de Prueba')

    def test_api_datos_completos_view(self):
        response = self.client.get(reverse('api_datos_completos'))
        self.assertEqual(response.status_code, 200)
        self.assertIn('cuentas', response.json())
        self.assertIn('movimientos', response.json())
        self.assertIn('categorias', response.json())

    def test_api_ejecutar_recurrentes_view(self):
        
        logger.warning("Iniciando test_api_ejecutar_recurrentes_view=%s", settings.RECURRENTES_API_TOKEN)
        
        response = self.client.post(reverse('api_ejecutar_recurrentes'), {
            'token': settings.RECURRENTES_API_TOKEN
        })
        self.assertEqual(response.status_code, 200)
        self.assertIn('mensaje', response.json())
        self.assertEqual(response.json()['mensaje'], 'Transacciones recurrentes ejecutadas')

