from django.shortcuts import render, redirect, get_object_or_404
from django.db.models import Q
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.contrib import messages
from django.utils import timezone
from .models import Asset, UserProfile, Organization, Location, ItemType, Unit, Custodian
from .forms import (
    AssetForm,
    UserRegistrationForm,
    OrganizationForm,
    LocationForm,
    ItemTypeForm,
    UnitForm,
    CustodianForm,
)


@login_required
def add_organization(request):
    if not request.user.is_superuser:
        messages.error(request, 'شما اجازه دسترسی به مدیریت سازمان ها را ندارید.')
        return redirect('dashboard')

    if request.method == 'POST':
        form = OrganizationForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, 'سازمان با موفقیت ثبت شد.')
            return redirect('add_organization')
    else:
        form = OrganizationForm()
    return render(request, 'assets/add_organization.html', {'form': form})


@login_required
def add_location(request):
    if not request.user.is_superuser:
        messages.error(request, 'شما اجازه دسترسی به مدیریت مکان ها را ندارید.')
        return redirect('dashboard')

    if request.method == 'POST':
        form = LocationForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, 'مکان با موفقیت ثبت شد.')
            return redirect('add_location')
    else:
        form = LocationForm()
    return render(request, 'assets/add_location.html', {'form': form})


@login_required
def add_item_type(request):
    if not request.user.is_superuser:
        messages.error(request, 'شما اجازه دسترسی به مدیریت انواع دارایی را ندارید.')
        return redirect('dashboard')

    if request.method == 'POST':
        form = ItemTypeForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, 'نوع دارایی با موفقیت ثبت شد.')
            return redirect('add_item_type')
    else:
        form = ItemTypeForm()
    return render(request, 'assets/add_item_type.html', {'form': form})


@login_required
def add_unit(request):
    if not request.user.is_superuser:
        messages.error(request, 'شما اجازه دسترسی به مدیریت واحدها را ندارید.')
        return redirect('dashboard')

    if request.method == 'POST':
        form = UnitForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, 'واحد با موفقیت ثبت شد.')
            return redirect('add_unit')
    else:
        form = UnitForm()
    return render(request, 'assets/add_unit.html', {'form': form})


def home(request):
    return render(request, 'assets/home.html')


def register(request):
    if not request.user.is_superuser:
        messages.error(request, 'شما اجازه ثبت کاربر جدید را ندارید.')
        return redirect('home')

    if request.method == 'POST':
        form = UserRegistrationForm(request.POST)
        if form.is_valid():
            user = form.save()
            messages.success(request, f'کاربر {user.username} با موفقیت ثبت شد.')
            return redirect('register')
    else:
        form = UserRegistrationForm()
    return render(request, 'registration/register.html', {'form': form})


@login_required
def dashboard(request):
    try:
        profile = request.user.userprofile
        assets_qs = Asset.objects.filter(organization=profile.organization)
        if profile.user_type == 'employee':
            owner_ids = UserProfile.objects.filter(
                organization=profile.organization,
                user_type='owner'
            ).values_list('user_id', flat=True)
            assets_qs = assets_qs.filter(
                Q(created_by=request.user) | Q(created_by__in=owner_ids)
            )

        assets = assets_qs.select_related('item_type', 'location', 'unit', 'custodian', 'created_by').order_by('-created_at')
        counts = {
            'total': assets_qs.count(),
            'pending': assets_qs.filter(status__in=['pending', 'purchase_requested']).count(),
            'approved': assets_qs.filter(status__in=['approved', 'purchase_received']).count(),
            'rejected': assets_qs.filter(status__in=['rejected', 'purchase_rejected']).count(),
            'pending_receipt': assets_qs.filter(status='purchase_approved').count(),
        }

        context = {
            'assets': assets,
            'profile': profile,
            'counts': counts,
        }
        return render(request, 'assets/dashboard.html', context)
    except UserProfile.DoesNotExist:
        if request.user.is_superuser:
            counted_assets = Asset.objects.filter(status__in=['approved', 'purchase_received'])
            purchase_pending_receipt = Asset.objects.filter(status='purchase_approved').count()
            return render(request, 'assets/admin_dashboard.html', {
                'organizations': Organization.objects.all(),
                'total_users': User.objects.count(),
                'total_assets': counted_assets.count(),
                'purchase_pending_receipt': purchase_pending_receipt,
            })
        messages.error(request, 'پروفایل سازمانی برای شما ثبت نشده است. با مدیر سیستم تماس بگیرید.')
        return redirect('home')


@login_required
def add_custodian(request):
    try:
        profile = request.user.userprofile
        if profile.user_type not in ('employee', 'owner'):
            messages.error(request, 'شما اجازه ثبت امین اموال را ندارید.')
            return redirect('dashboard')

        if request.method == 'POST':
            form = CustodianForm(request.POST)
            if form.is_valid():
                custodian = form.save(commit=False)
                custodian.organization = profile.organization
                custodian.created_by = request.user
                if profile.user_type == 'owner':
                    custodian.status = 'approved'
                    custodian.approved_by = request.user
                    custodian.approved_at = timezone.now()
                custodian.save()
                if profile.user_type == 'owner':
                    messages.success(request, 'امین اموال با موفقیت ثبت و تایید شد.')
                else:
                    messages.success(request, 'امین اموال ثبت شد و پس از تایید قابل استفاده است.')
                return redirect('add_custodian')
        else:
            form = CustodianForm()
        return render(request, 'assets/add_custodian.html', {'form': form})
    except UserProfile.DoesNotExist:
        messages.error(request, 'پروفایل سازمانی برای شما ثبت نشده است.')
        return redirect('home')


@login_required
def manage_custodians(request):
    try:
        profile = request.user.userprofile
        if profile.user_type not in ('owner', 'employee'):
            messages.error(request, 'شما اجازه مدیریت امین ها را ندارید.')
            return redirect('dashboard')

        custodians = Custodian.objects.filter(organization=profile.organization).select_related('created_by', 'approved_by').order_by('-created_at')
        return render(request, 'assets/manage_custodians.html', {
            'custodians': custodians,
            'profile': profile,
        })
    except UserProfile.DoesNotExist:
        messages.error(request, 'پروفایل سازمانی برای شما ثبت نشده است.')
        return redirect('home')


@login_required
def approve_custodian(request, custodian_id):
    try:
        profile = request.user.userprofile
        if profile.user_type != 'owner':
            messages.error(request, 'شما اجازه تایید یا رد امین را ندارید.')
            return redirect('dashboard')

        custodian = get_object_or_404(Custodian, id=custodian_id, organization=profile.organization)
        if request.method == 'POST':
            action = request.POST.get('action')
            if action == 'approve':
                custodian.status = 'approved'
                custodian.approved_by = request.user
                custodian.approved_at = timezone.now()
                custodian.save()
                messages.success(request, 'امین اموال تایید شد.')
            elif action == 'reject':
                custodian.status = 'rejected'
                custodian.save()
                messages.success(request, 'امین اموال رد شد.')
        return redirect('manage_custodians')
    except UserProfile.DoesNotExist:
        messages.error(request, 'پروفایل سازمانی برای شما ثبت نشده است.')
        return redirect('home')


@login_required
def add_asset(request):
    try:
        profile = request.user.userprofile
        if profile.user_type not in ('employee', 'owner'):
            messages.error(request, 'شما اجازه ثبت دارایی را ندارید.')
            return redirect('dashboard')

        approved_custodians = Custodian.objects.filter(
            organization=profile.organization,
            status='approved'
        ).order_by('first_name', 'last_name')

        if request.method == 'POST':
            form = AssetForm(request.POST)
            form.fields['custodian'].queryset = approved_custodians
            if form.is_valid():
                asset = form.save(commit=False)
                asset.organization = profile.organization
                asset.created_by = request.user
                if profile.user_type == 'owner':
                    if asset.availability == 'available':
                        asset.status = 'approved'
                        asset.approved_by = request.user
                        asset.approved_at = timezone.now()
                    else:
                        asset.status = 'purchase_requested'
                asset.save()
                if profile.user_type == 'owner':
                    if asset.availability == 'available':
                        messages.success(request, 'دارایی با موفقیت ثبت و تایید شد.')
                    else:
                        messages.success(request, 'درخواست خرید با موفقیت ثبت شد و برای بررسی ارسال شد.')
                else:
                    messages.success(request, 'دارایی ثبت شد و منتظر تایید مدیر است.')
                return redirect('dashboard')
        else:
            form = AssetForm()
            form.fields['custodian'].queryset = approved_custodians
            if not approved_custodians.exists():
                messages.warning(request, 'هیچ امین تایید شده ای وجود ندارد. ابتدا یک امین ثبت و تایید کنید.')

        return render(request, 'assets/add_asset.html', {'form': form})
    except UserProfile.DoesNotExist:
        messages.error(request, 'پروفایل سازمانی برای شما ثبت نشده است.')
        return redirect('home')


@login_required
def approve_asset(request, asset_id):
    try:
        profile = request.user.userprofile
        if profile.user_type != 'owner':
            messages.error(request, 'شما اجازه تایید یا رد دارایی را ندارید.')
            return redirect('dashboard')

        asset = get_object_or_404(Asset, id=asset_id, organization=profile.organization)

        if asset.status != 'pending':
            messages.info(request, 'این دارایی قبلا بررسی شده است.')
            return redirect('dashboard')

        if request.method == 'POST':
            action = request.POST.get('action')
            if action == 'approve' and asset.availability == 'available':
                asset.status = 'approved'
                asset.approved_by = request.user
                asset.approved_at = timezone.now()
                asset.save()
                messages.success(request, 'دارایی تایید شد.')
            elif action == 'purchase' and asset.availability == 'unavailable':
                asset.status = 'purchase_requested'
                asset.save()
                messages.success(request, 'درخواست خرید ثبت شد.')
            elif action == 'reject':
                asset.status = 'rejected'
                asset.save()
                messages.success(request, 'دارایی رد شد.')

            return redirect('dashboard')

        return render(request, 'assets/approve_asset.html', {'asset': asset})
    except UserProfile.DoesNotExist:
        messages.error(request, 'پروفایل سازمانی برای شما ثبت نشده است.')
        return redirect('home')


@login_required
def manage_purchase_requests(request):
    if not request.user.is_superuser:
        messages.error(request, 'شما اجازه مدیریت درخواست های خرید را ندارید.')
        return redirect('home')

    assets = Asset.objects.filter(
        status='purchase_requested'
    ).select_related('organization', 'item_type', 'created_by', 'custodian').order_by('-created_at')
    return render(request, 'assets/manage_purchase_requests.html', {'assets': assets})


@login_required
def approve_purchase_request(request, asset_id):
    if not request.user.is_superuser:
        messages.error(request, 'شما اجازه بررسی درخواست های خرید را ندارید.')
        return redirect('home')

    asset = get_object_or_404(Asset, id=asset_id, status='purchase_requested')
    if request.method == 'POST':
        action = request.POST.get('action')
        if action == 'approve':
            asset.status = 'purchase_approved'
            asset.approved_by = request.user
            asset.approved_at = timezone.now()
            asset.save()
            messages.success(request, 'درخواست خرید تایید شد.')
        elif action == 'reject':
            asset.status = 'purchase_rejected'
            asset.save()
            messages.success(request, 'درخواست خرید رد شد.')
    return redirect('manage_purchase_requests')


@login_required
def receive_asset(request, asset_id):
    try:
        profile = request.user.userprofile
        if profile.user_type not in ('employee', 'owner'):
            messages.error(request, 'شما اجازه ثبت دریافت دارایی را ندارید.')
            return redirect('dashboard')

        asset = get_object_or_404(
            Asset,
            id=asset_id,
            organization=profile.organization,
            created_by=request.user,
            status='purchase_approved'
        )

        if request.method == 'POST':
            asset.status = 'purchase_received'
            asset.received_by = request.user
            asset.received_at = timezone.now()
            asset.save()
            messages.success(request, 'دریافت دارایی با موفقیت ثبت شد.')

        return redirect('dashboard')
    except UserProfile.DoesNotExist:
        messages.error(request, 'پروفایل سازمانی برای شما ثبت نشده است.')
        return redirect('home')


@login_required
def manage_users(request):
    if not request.user.is_superuser:
        messages.error(request, 'شما اجازه مدیریت کاربران را ندارید.')
        return redirect('home')

    users_with_profiles = User.objects.filter(userprofile__isnull=False).select_related('userprofile', 'userprofile__organization')
    return render(request, 'assets/manage_users.html', {'users': users_with_profiles})


@login_required
def asset_detail(request, asset_id):
    try:
        profile = request.user.userprofile
        asset = get_object_or_404(Asset, id=asset_id, organization=profile.organization)
        can_receive = (
            profile.user_type in ('employee', 'owner')
            and asset.status == 'purchase_approved'
            and asset.created_by_id == request.user.id
        )
        return render(request, 'assets/asset_detail.html', {
            'asset': asset,
            'can_receive': can_receive,
        })
    except UserProfile.DoesNotExist:
        messages.error(request, 'پروفایل سازمانی برای شما ثبت نشده است.')
        return redirect('home')
