import React, { useState } from 'react';
import { Head, useForm, Link } from '@inertiajs/react';
import { Card, Col, Container, Form, Row, Button, Spinner, InputGroup } from 'react-bootstrap';
import Layout from '../../../Layouts';
import Swal from 'sweetalert2';
import { useLoading } from '../../../LoadingContext';
import { Eye, EyeOff, Check, X } from 'lucide-react';

interface Props {
    usuario: any;
}

const Editar = ({ usuario }: Props) => {
    const { data, setData, put, processing, errors } = useForm({
        name: usuario.name || '',
        email: usuario.email || '',
        password: '',
        password_confirmation: '',
        role: usuario.role || 'user',
        is_active: usuario.is_active === 1 || usuario.is_active === true,
    });
    const { showLoading, hideLoading } = useLoading();

    // Estados para visibilidad de contraseña
    const [showPassword, setShowPassword] = useState(false);
    const [showConfirmPassword, setShowConfirmPassword] = useState(false);

    // Función para validar fuerza de contraseña
    const checkStrength = (pass: string) => {
        return {
            length: pass.length >= 8,
            uppercase: /[A-Z]/.test(pass),
            number: /[0-9]/.test(pass),
            special: /[!@#$%^&*(),.?":{}|<>]/.test(pass),
        };
    };

    const strength = checkStrength(data.password);
    const isStrengthValid = Object.values(strength).every(Boolean);

    const handleSubmit = (e: React.FormEvent) => {
        e.preventDefault();

        // Validación condicional: Si confirma contraseña, debe ingresar la nueva
        if (data.password_confirmation && !data.password) {
            Swal.fire({
                title: 'Error',
                text: 'Debes ingresar la nueva contraseña si has llenado la confirmación.',
                icon: 'error'
            });
            return;
        }

        // Validación de fuerza si se ingresó contraseña
        if (data.password && !isStrengthValid) {
            Swal.fire({
                title: 'Contraseña Débil',
                text: 'La contraseña debe cumplir con todos los requisitos de seguridad.',
                icon: 'warning'
            });
            return;
        }

        showLoading();
        // Usamos post con _method: 'PUT' si hay problemas, pero Inertia put suele funcionar
        put(route('users.update', usuario.id), {
            onSuccess: () => {
                hideLoading();
                Swal.fire({
                    title: 'Éxito',
                    text: 'Usuario actualizado correctamente',
                    icon: 'success',
                    timer: 1500,
                    showConfirmButton: false
                });
            },
            onError: () => {
                hideLoading();
                Swal.fire({
                    title: 'Error',
                    text: 'Por favor corrige los errores en el formulario',
                    icon: 'error'
                });
            },
            onFinish: () => hideLoading()
        });
    };

    return (
        <React.Fragment>
            <Head title="Editar Usuario" />
            <div className="page-content">
                <Container fluid>
                    <Row>
                        <Col lg={12}>
                            <Card>
                                <Card.Header className="d-flex justify-content-between align-items-center">
                                    <h4 className="card-title mb-0">Editar Usuario: {usuario.name}</h4>
                                    <Link href={route('users.index')} className="btn btn-secondary btn-sm">
                                        Volver
                                    </Link>
                                </Card.Header>
                                <Card.Body>
                                    <Form onSubmit={handleSubmit}>
                                        <Row>
                                            <Col md={6} className="mb-3">
                                                <Form.Group>
                                                    <Form.Label>Nombre <span className="text-danger">*</span></Form.Label>
                                                    <Form.Control
                                                        type="text"
                                                        value={data.name}
                                                        onChange={e => setData('name', e.target.value)}
                                                        isInvalid={!!errors.name}
                                                        placeholder="Nombre completo"
                                                    />
                                                    <Form.Control.Feedback type="invalid">{errors.name}</Form.Control.Feedback>
                                                </Form.Group>
                                            </Col>

                                            <Col md={6} className="mb-3">
                                                <Form.Group>
                                                    <Form.Label>Email <span className="text-danger">*</span></Form.Label>
                                                    <Form.Control
                                                        type="email"
                                                        value={data.email}
                                                        onChange={e => setData('email', e.target.value)}
                                                        isInvalid={!!errors.email}
                                                        placeholder="nombre@ejemplo.com"
                                                    />
                                                    <Form.Control.Feedback type="invalid">{errors.email}</Form.Control.Feedback>
                                                </Form.Group>
                                            </Col>

                                            <Col md={12} className="mb-3">
                                                <div className="alert alert-info py-2">
                                                    <small>Dejar los campos de contraseña vacíos para mantener la actual.</small>
                                                </div>
                                            </Col>

                                            <Col md={6} className="mb-3">
                                                <Form.Group>
                                                    <Form.Label>Nueva Contraseña</Form.Label>
                                                    <InputGroup>
                                                        <Form.Control
                                                            type={showPassword ? "text" : "password"}
                                                            value={data.password}
                                                            onChange={e => setData('password', e.target.value)}
                                                            isInvalid={!!errors.password}
                                                            placeholder="Mínimo 8 caracteres (Opcional)"
                                                        />
                                                        <Button
                                                            variant="outline-secondary"
                                                            onClick={() => setShowPassword(!showPassword)}
                                                            type="button"
                                                        >
                                                            {showPassword ? <EyeOff size={18} /> : <Eye size={18} />}
                                                        </Button>
                                                        <Form.Control.Feedback type="invalid">{errors.password}</Form.Control.Feedback>
                                                    </InputGroup>

                                                    {/* Medidor de Fuerza de Contraseña */}
                                                    {data.password && (
                                                        <div className="mt-2 p-2 bg-light rounded border">
                                                            <small className="d-block fw-bold mb-1">Requisitos de seguridad:</small>
                                                            <ul className="list-unstyled mb-0" style={{ fontSize: '0.85rem' }}>
                                                                <li className={strength.length ? "text-success" : "text-danger"}>
                                                                    {strength.length ? <Check size={14} className="me-1" /> : <X size={14} className="me-1" />}
                                                                    Mínimo 8 caracteres
                                                                </li>
                                                                <li className={strength.uppercase ? "text-success" : "text-danger"}>
                                                                    {strength.uppercase ? <Check size={14} className="me-1" /> : <X size={14} className="me-1" />}
                                                                    Al menos 1 mayúscula
                                                                </li>
                                                                <li className={strength.number ? "text-success" : "text-danger"}>
                                                                    {strength.number ? <Check size={14} className="me-1" /> : <X size={14} className="me-1" />}
                                                                    Al menos 1 número
                                                                </li>
                                                                <li className={strength.special ? "text-success" : "text-danger"}>
                                                                    {strength.special ? <Check size={14} className="me-1" /> : <X size={14} className="me-1" />}
                                                                    Al menos 1 carácter especial
                                                                </li>
                                                            </ul>
                                                        </div>
                                                    )}
                                                </Form.Group>
                                            </Col>

                                            <Col md={6} className="mb-3">
                                                <Form.Group>
                                                    <Form.Label>Confirmar Nueva Contraseña</Form.Label>
                                                    <InputGroup>
                                                        <Form.Control
                                                            type={showConfirmPassword ? "text" : "password"}
                                                            value={data.password_confirmation}
                                                            onChange={e => setData('password_confirmation', e.target.value)}
                                                            placeholder="Repite la nueva contraseña"
                                                        />
                                                        <Button
                                                            variant="outline-secondary"
                                                            onClick={() => setShowConfirmPassword(!showConfirmPassword)}
                                                            type="button"
                                                        >
                                                            {showConfirmPassword ? <EyeOff size={18} /> : <Eye size={18} />}
                                                        </Button>
                                                    </InputGroup>
                                                </Form.Group>
                                            </Col>

                                            <Col md={6} className="mb-3">
                                                <Form.Group>
                                                    <Form.Label>Rol <span className="text-danger">*</span></Form.Label>
                                                    <Form.Select
                                                        value={data.role}
                                                        onChange={e => setData('role', e.target.value)}
                                                        isInvalid={!!errors.role}
                                                    >
                                                        <option value="user">Usuario</option>
                                                        <option value="admin">Administrador</option>
                                                        <option value="super_admin">Super Admin</option>
                                                    </Form.Select>
                                                    <Form.Control.Feedback type="invalid">{errors.role}</Form.Control.Feedback>
                                                </Form.Group>
                                            </Col>

                                            <Col md={6} className="mb-3 d-flex align-items-center">
                                                <Form.Check
                                                    type="switch"
                                                    id="custom-switch"
                                                    label="Usuario Activo"
                                                    checked={data.is_active}
                                                    onChange={e => setData('is_active', e.target.checked)}
                                                />
                                            </Col>
                                        </Row>
                                        <div className="d-flex justify-content-end gap-2 mt-3">
                                            <Link href={route('users.index')} className="btn btn-light">Cancelar</Link>
                                            <Button type="submit" variant="primary" disabled={processing}>
                                                {processing ? <Spinner animation="border" size="sm" /> : 'Actualizar Usuario'}
                                            </Button>
                                        </div>
                                    </Form>
                                </Card.Body>
                            </Card>
                        </Col>
                    </Row>
                </Container>
            </div>
        </React.Fragment>
    );
};

Editar.layout = (page: any) => <Layout children={page} />;
export default Editar;
