# users/views.py
from django.shortcuts import render, redirect


from django.contrib.auth import authenticate, login
from django.contrib.auth import logout
from .forms import LoginForm
from .models import CustomUser
from django.contrib.auth.decorators import login_required
from .forms import SetPinsForm
from .models import PinHistory
from accounts.decorators import role_required
from django.http import FileResponse, Http404
from django.conf import settings
import os


# views.py
from django.shortcuts import render
from dashboard.models import Wallet, PromoBanner, QuickAction, ExploreItem, Voucher, ThinBanner
from django.utils.timezone import now

@login_required
def homenew(request):
    user = request.user
    # Wallet logic
    wallet = Wallet.objects.filter(user=user).first()

    # Fetch promo banners that are active based on date.
    promo_banners = PromoBanner.objects.filter(active=True, start_date__lte=now(), end_date__gte=now())

    quick_actions = QuickAction.objects.filter(active=True)[:4]
    explore_items = ExploreItem.objects.filter(active=True).order_by('order')
    vouchers = Voucher.objects.filter(active=True)
    thin_banners = ThinBanner.objects.filter(active=True)

    context = {
        'wallet_main': wallet.main_balance if wallet else 0,
        'wallet_cashback': wallet.cashback if wallet else 0,
        'wallet_external': wallet.external_balance if wallet else 0,
        'lifetime_cashback': wallet.lifetime_cashback if wallet else 0,
        'cashback_today': wallet.cashback_today if wallet else 0,
        'promo_banners': promo_banners,
        'quick_actions': quick_actions,
        'explore_items': explore_items,
        'vouchers': vouchers,
        'thin_banners': thin_banners,
    }
    return render(request, "users/homel.html", context)

def serve_logo(request):
    path = os.path.join(settings.STATIC_ROOT, 'img', 'logo.png')
    return FileResponse(open(path, 'rb'), content_type='image/png')

def serve_static(request, path):
    file_path = os.path.join(settings.STATIC_ROOT, path)
    if os.path.exists(file_path):
        return FileResponse(open(file_path, 'rb'))
    raise Http404("Static file not found")

def home_view(request):
    return render(request, "users/h.html")




@login_required
def dashboard(request):
    return render(request, 'users/dashboard.html')

import random

def get_dummy_wallet_data():
    return {
        '1App Wallet': f"₹{random.uniform(100, 1000):.2f}",
        'ViralPe Wallet': f"₹{random.uniform(1000, 5000):.2f}",
        'Today Earnings': f"₹{random.uniform(100, 900):.2f}",
    }

def chunk_list(lst, size):
    return [lst[i:i + size] for i in range(0, len(lst), size)]
    

@login_required
def home(request):
    user_pincode = request.session.get('user_pincode', 'Fetching...')

    quick_actions = [
        {'label': 'Pay', 'icon': 'fa-qrcode', 'image': 'icons/pay_btn.png', 'url': 'scan_pay'},
        {'label': '1Apportunity', 'icon': 'fa-bullhorn', 'image': 'icons/1app_btn.png', 'external': 'intent://app.1apportunity.com#Intent;scheme=https;package=com.app.1apportunity;end'},
        {'label': 'Vouchers', 'icon': 'fa-ticket-alt', 'image': 'icons/vouchers_btn.png', 'url': 'vouchers'},
        {'label': 'Bills', 'icon': 'fa-file-invoice', 'image': 'icons/bills_btn.png', 'url': 'bills'},
        {'label': 'Recharge', 'icon': 'fa-bolt', 'image': 'icons/recharge_btn.png', 'url': 'recharge_form'},
    ]
    # wallet_data = {
    #     '1App Wallet': '₹123.45',
    #     'ViralPe Wallet': '₹456.78',
    #     'Today Earnings': '₹89.00',
    # }
    wallet_data = get_dummy_wallet_data()
    explore_features = [
        {'label': 'Bills & Recharges', 'icon': 'fa-receipt', 'url': 'bills_recharges'},
        {'label': 'Buy Vouchers', 'icon': 'fa-gift', 'url': 'buy_vouchers'},
        {'label': 'Shopping', 'icon': 'fa-shopping-cart', 'url': 'shopping'},
        {'label': 'Avail Services', 'icon': 'fa-concierge-bell', 'url': 'services'},
        {'label': 'Utilities', 'icon': 'fa-lightbulb', 'url': 'utilities'},
        {'label': 'View All', 'icon': 'fa-ellipsis-h', 'url': 'explore_viralpe'},
    ]


    voucher_brands = [
        {'name': 'Amazon', 'image': 'vouchers/amazon.png'},
        {'name': 'Flipkart', 'image': 'vouchers/flipkart.png'},
        {'name': 'BigBazaar', 'image': 'vouchers/bigbazaar.png'},
        {'name': 'Ajio', 'image': 'vouchers/ajio.png'},
        {'name': 'Myntra', 'image': 'vouchers/myntra.png'},
    ]

    
    promo_banners = [
        {'title': 'Summer Sale', 'image': 'banners/summer_sale.png'},
        {'title': 'Refer & Earn', 'image': 'banners/refer_earn.png'},
        {'title': 'Cashback Bonanza', 'image': 'banners/cashback_bonanza.png'},
        {'title': 'Spin & Win', 'image': 'banners/spin_win.png'},
    ]

    promo_pairs = chunk_list(promo_banners, 2)

    thin_banners = [
        {'image': 'banners/banner-1.png'},
        {'image': 'banners/banner-2.png'},
        {'image': 'banners/banner-3.png'},
    ]
    
    lifetime_cashback = round(random.uniform(100.00, 10000.00), 2)
    cashback_today = round(random.uniform(1, 99), 2)  # ₹1.00 to ₹99.99


    return render(request, 'users/home.html', {
        'quick_actions': quick_actions,
        'wallet_data': wallet_data,
        'explore_features': explore_features,
        'voucher_brands': voucher_brands,
        # 'promo_banners': promo_banners,
        'promo_pairs':promo_pairs,
        'user_pincode': user_pincode,
        'thin_banners': thin_banners,
        'lifetime_cashback': lifetime_cashback,
        'cashback_today': cashback_today,


    })






from django.shortcuts import render
from accounts.decorators import role_required, roles_required

@role_required('pincode_head')
def pincode_dashboard(request):
    return render(request, 'users/pincode_dashboard.html')

@role_required('vendor')
def vendor_dashboard(request):
    return render(request, 'users/vendor_dashboard.html')

@roles_required('admin', 'state_head')
def manage_districts(request):
    return render(request, 'users/manage_districts.html')

from django.shortcuts import render

@login_required
def navigation_menu(request):
    return render(request, 'users/navigation_menu.html')

from django.contrib.auth.decorators import login_required
from django.shortcuts import render

@login_required
def scan_pay(request):
    return render(request, 'users/scan_pay.html')


from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.db.models import Sum
from payments.models import ExternalWalletTopUp, ExternalWalletUsage, ViralPeWallet
from django.utils import timezone


from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from payments.models import ExternalWallet, ViralPeWallet, ViralPeWalletUsage,ExternalWalletTransaction,RechargePaymentSummary
from decimal import Decimal, ROUND_HALF_UP
from django.db.models import Sum
from django.utils.timezone import now
from django.db.models import Sum, Value, CharField
from itertools import chain
from operator import attrgetter
from django.db import models

def round2(val):
    # return Decimal(val or 0).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
    return Decimal(val or 0).quantize(Decimal('0'), rounding=ROUND_HALF_UP)

@login_required
def wallet_view(request):
    user = request.user

    # Wallet balances
    external_wallet_obj = ExternalWallet.objects.filter(user=user).first()
    viralpe_wallet_obj = ViralPeWallet.objects.filter(user=user).first()

    external_wallet = round2(external_wallet_obj.balance) if external_wallet_obj else Decimal('0.00')
    viralpe_wallet = round2(viralpe_wallet_obj.balance) if viralpe_wallet_obj else Decimal('0.00')

    # Income / Expense from both wallets
    vp_income = ViralPeWalletUsage.objects.filter(user=user, transaction_type="credit").aggregate(total=Sum('amount_used'))['total'] or Decimal('0.00')
    vp_expense = ViralPeWalletUsage.objects.filter(user=user, transaction_type="debit").aggregate(total=Sum('amount_used'))['total'] or Decimal('0.00')

    ext_income = ExternalWalletTransaction.objects.filter(user=user, transaction_type="credit").aggregate(total=Sum('amount'))['total'] or Decimal('0.00')
    ext_expense = ExternalWalletTransaction.objects.filter(user=user, transaction_type="debit").aggregate(total=Sum('amount'))['total'] or Decimal('0.00')

    income = round2(vp_income + ext_income)
    expense = round2(vp_expense + ext_expense)

    transactions = RechargePaymentSummary.objects.filter(user=user).order_by('-updated_at')[:5]

    # all_txns = sorted(
    #     chain(vp_txns, ext_txns),
    #     key=attrgetter('final_date'),
    #     reverse=True
    # )[:5]

    context = {
        'external_wallet': external_wallet,
        'viralpe_wallet': viralpe_wallet,
        'income': income,
        'expense': expense,
        'transactions': transactions,
    }

    return render(request, 'users/wallet_page.html', context)





@login_required
def lets_earn(request):
    return render(request, 'users/lets_earn.html')

@login_required
def voucher_list(request):
    return render(request, 'users/vouchers.html')

@login_required
def recharge_home(request):
    return render(request, 'users/recharge.html')

@login_required
def bill_home(request):
    return render(request, 'users/bills.html')


from django.shortcuts import render
from django.http import HttpResponse

from django.contrib.auth.decorators import login_required
from django.shortcuts import render

@login_required
def bills_recharges(request):
    return render(request, 'users/bills_recharges.html')

@login_required
def buy_vouchers(request):
    return render(request, 'users/buy_vouchers.html')

@login_required
def shopping(request):
    return render(request, 'users/shopping.html')

@login_required
def services(request):
    return render(request, 'users/services.html')

@login_required
def utilities(request):
    return render(request, 'users/utilities.html')

@login_required
def explore_viralpe(request):
    return render(request, 'users/explore_viralpe.html')


from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import permissions, parsers, status
from django.db import transaction
from .serializers import ProfilePhotoUploadSerializer
from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework.permissions import IsAuthenticated

class ProfilePhotoUploadView(APIView):
    # permission_classes = [permissions.IsAuthenticated]
    # permission_classes = [permissions.AllowAny]
    # authentication_classes = [JWTAuthentication]
    permission_classes = [IsAuthenticated]
    parser_classes = [parsers.MultiPartParser, parsers.FormParser]

    @transaction.atomic
    def post(self, request, *args, **kwargs):
        ser = ProfilePhotoUploadSerializer(data=request.data)
        ser.is_valid(raise_exception=True)

        user = request.user  # Assumes you’re using DRF auth; user is CustomUser
        new_img = ser.validated_data["image"]

        # Optional: delete old file to avoid orphaned storage
        old = user.profile_pic
        user.profile_pic = new_img
        user.save(update_fields=["profile_pic"])

        # Clean up previous file if it existed and changed
        if old and old.name and old.name != user.profile_pic.name:
            try:
                old.storage.delete(old.name)
            except Exception:
                pass  # don't fail request on cleanup

        photo_url = request.build_absolute_uri(user.profile_pic.url) if user.profile_pic else None
        return Response(
            {"status": "ok", "photo_url": photo_url, "message": "Profile photo updated."},
            status=status.HTTP_200_OK,
        )




# users/views.py
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from django.db import transaction

@api_view(["POST"])
@permission_classes([IsAuthenticated])
def save_pincode(request):
    u = request.user
    pincode = str(request.data.get("pincode") or "").strip()
    state = (request.data.get("state") or "").strip()
    district = (request.data.get("district") or "").strip()
    city = (request.data.get("city") or "").strip()
    location = (request.data.get("location") or "").strip()  # for auditing/choice

    if not (pincode.isdigit() and len(pincode)==6 and state and district and (city or location)):
        return Response({"message": "Incomplete data"}, status=400)

    with transaction.atomic():
        u.pincode = pincode
        u.state = state
        u.district = district
        # choose either city or location (your call); here we store a city value
        u.city = city or location
        u.save(update_fields=["pincode","state","district","city"])

    # return fresh user shape that your frontend expects
    return Response({"status": "ok", "user": {
        "id": u.id,
        "mobile_number": u.mobile_number,
        "first_name": u.first_name,
        "last_name": u.last_name,
        "pincode": u.pincode,
        "state": u.state,
        "district": u.district,
        "city": u.city,
        "role": u.role,
    }})
