import os
import sys
from datetime import datetime, date
from werkzeug.security import generate_password_hash

# Agregar el directorio raíz al path
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(__file__))))

from src.models.user import db, User
from src.models.company import Company
from src.models.invoice import Invoice
from src.models.expense_type import ExpenseType, EXPENSE_TYPES_DATA

def create_test_data(app):
    """Crea datos de prueba para el sistema"""
    with app.app_context():
        # Limpiar datos existentes
        db.drop_all()
        db.create_all()
        
        # Insertar tipos de gastos
        for expense_data in EXPENSE_TYPES_DATA:
            expense_type = ExpenseType(**expense_data)
            db.session.add(expense_type)
        
        # Crear empresas de prueba
        company1 = Company(
            name="Empresa Demo S.R.L.",
            rnc="101-12345-6",
            address="Av. Winston Churchill #123, Santo Domingo",
            phone="809-555-0123",
            email="info@empresademo.com",
            status="active"
        )
        
        company2 = Company(
            name="Comercial Ejemplo EIRL",
            rnc="130-98765-4",
            address="Calle El Conde #456, Zona Colonial",
            phone="809-555-0456",
            email="contacto@comercialejemplo.com",
            status="active"
        )
        
        db.session.add(company1)
        db.session.add(company2)
        db.session.flush()  # Para obtener los IDs
        
        # Crear usuarios de prueba
        # Super Admin
        super_admin = User(
            username="superadmin",
            email="admin@sistema606.com",
            first_name="Super",
            last_name="Administrador",
            phone="809-555-0001",
            role="super_admin",
            is_active=True
        )
        super_admin.set_password("admin123")
        
        # Contador de Empresa 1
        accountant1 = User(
            username="contador1",
            email="contador@empresademo.com",
            first_name="María",
            last_name="González",
            phone="809-555-0002",
            role="accountant",
            company_id=company1.id,
            is_active=True
        )
        accountant1.set_password("contador123")
        
        # Empleado de Empresa 1
        employee1 = User(
            username="empleado1",
            email="empleado@empresademo.com",
            first_name="Juan",
            last_name="Pérez",
            phone="809-555-0003",
            role="employee",
            company_id=company1.id,
            is_active=True
        )
        employee1.set_password("empleado123")
        
        # Contador de Empresa 2
        accountant2 = User(
            username="contador2",
            email="contador@comercialejemplo.com",
            first_name="Ana",
            last_name="Rodríguez",
            phone="809-555-0004",
            role="accountant",
            company_id=company2.id,
            is_active=True
        )
        accountant2.set_password("contador123")
        
        db.session.add(super_admin)
        db.session.add(accountant1)
        db.session.add(employee1)
        db.session.add(accountant2)
        db.session.flush()
        
        # Crear facturas de prueba para Empresa 1
        facturas_empresa1 = [
            {
                'invoice_number': 'INV-20240801-ABC123',
                'ncf': 'B0100000001',
                'supplier_name': 'Suplidora Nacional S.A.',
                'supplier_rnc': '101-11111-1',
                'supplier_id_type': 'RNC',
                'invoice_date': date(2024, 8, 15),
                'payment_date': date(2024, 8, 20),
                'invoiced_amount': 50000.00,
                'itbis_invoiced': 9000.00,
                'itbis_retained': 0.00,
                'expense_type': '02',
                'status': 'approved',
                'company_id': company1.id,
                'created_by_user_id': employee1.id,
                'approved_by_user_id': accountant1.id,
                'approved_at': datetime(2024, 8, 16, 10, 30)
            },
            {
                'invoice_number': 'INV-20240802-DEF456',
                'ncf': 'B0100000002',
                'supplier_name': 'Servicios Técnicos RD',
                'supplier_rnc': '101-22222-2',
                'supplier_id_type': 'RNC',
                'invoice_date': date(2024, 8, 18),
                'payment_date': date(2024, 8, 25),
                'invoiced_amount': 25000.00,
                'itbis_invoiced': 4500.00,
                'itbis_retained': 500.00,
                'expense_type': '02',
                'status': 'approved',
                'company_id': company1.id,
                'created_by_user_id': employee1.id,
                'approved_by_user_id': accountant1.id,
                'approved_at': datetime(2024, 8, 19, 14, 15)
            },
            {
                'invoice_number': 'INV-20240803-GHI789',
                'ncf': 'B0100000003',
                'supplier_name': 'Combustibles del Caribe',
                'supplier_rnc': '101-33333-3',
                'supplier_id_type': 'RNC',
                'invoice_date': date(2024, 8, 20),
                'invoiced_amount': 15000.00,
                'itbis_invoiced': 2700.00,
                'expense_type': '09',
                'status': 'pending',
                'company_id': company1.id,
                'created_by_user_id': employee1.id
            },
            {
                'invoice_number': 'INV-20240804-JKL012',
                'ncf': 'B0100000004',
                'supplier_name': 'Alquiler de Equipos SA',
                'supplier_rnc': '101-44444-4',
                'supplier_id_type': 'RNC',
                'invoice_date': date(2024, 8, 22),
                'payment_date': date(2024, 8, 30),
                'invoiced_amount': 35000.00,
                'itbis_invoiced': 6300.00,
                'expense_type': '03',
                'status': 'approved',
                'company_id': company1.id,
                'created_by_user_id': employee1.id,
                'approved_by_user_id': accountant1.id,
                'approved_at': datetime(2024, 8, 23, 9, 45)
            }
        ]
        
        # Crear facturas de prueba para Empresa 2
        facturas_empresa2 = [
            {
                'invoice_number': 'INV-20240805-MNO345',
                'ncf': 'B0200000001',
                'supplier_name': 'Papelería Central',
                'supplier_rnc': '130-55555-5',
                'supplier_id_type': 'RNC',
                'invoice_date': date(2024, 8, 10),
                'payment_date': date(2024, 8, 15),
                'invoiced_amount': 8000.00,
                'itbis_invoiced': 1440.00,
                'expense_type': '02',
                'status': 'approved',
                'company_id': company2.id,
                'created_by_user_id': accountant2.id,
                'approved_by_user_id': accountant2.id,
                'approved_at': datetime(2024, 8, 11, 11, 20)
            },
            {
                'invoice_number': 'INV-20240806-PQR678',
                'ncf': 'B0200000002',
                'supplier_name': 'Seguros Universales',
                'supplier_rnc': '130-66666-6',
                'supplier_id_type': 'RNC',
                'invoice_date': date(2024, 8, 12),
                'payment_date': date(2024, 8, 20),
                'invoiced_amount': 12000.00,
                'itbis_invoiced': 2160.00,
                'expense_type': '11',
                'status': 'approved',
                'company_id': company2.id,
                'created_by_user_id': accountant2.id,
                'approved_by_user_id': accountant2.id,
                'approved_at': datetime(2024, 8, 13, 16, 30)
            }
        ]
        
        # Insertar facturas
        for factura_data in facturas_empresa1 + facturas_empresa2:
            factura = Invoice(**factura_data)
            # Obtener descripción del tipo de gasto
            expense_type = ExpenseType.query.get(factura.expense_type)
            if expense_type:
                factura.expense_description = expense_type.name
            db.session.add(factura)
        
        # Confirmar cambios
        db.session.commit()
        
        print("✅ Datos de prueba creados exitosamente:")
        print(f"   - {Company.query.count()} empresas")
        print(f"   - {User.query.count()} usuarios")
        print(f"   - {Invoice.query.count()} facturas")
        print(f"   - {ExpenseType.query.count()} tipos de gastos")
        
        return {
            'companies': [company1, company2],
            'users': {
                'super_admin': super_admin,
                'accountant1': accountant1,
                'employee1': employee1,
                'accountant2': accountant2
            },
            'invoices_count': Invoice.query.count()
        }

def get_test_credentials():
    """Retorna las credenciales de prueba"""
    return {
        'super_admin': {'username': 'superadmin', 'password': 'admin123'},
        'accountant1': {'username': 'contador1', 'password': 'contador123'},
        'employee1': {'username': 'empleado1', 'password': 'empleado123'},
        'accountant2': {'username': 'contador2', 'password': 'contador123'}
    }

