from django.http import Http404, JsonResponse
from django.shortcuts import redirect, render
from django.contrib.auth.decorators import login_required
from django.db.models import Q, Count, Max, Min
from developer.models import Developer
from development.models import Development
from geo_location.forms import MasterCityEditForm, MasterCountryEditForm
from main.utils import user_control
from user.utils import get_settings
from .models import City, Country, District
from .serializers import MasterCitySerializer, MasterCountrySerializer
# Create your views here.

@login_required()
def master_countries(request):
    user_controller = user_control(request)
    if not user_controller['has_perm']:
        return redirect(user_controller['redirect_uri'])
    site_settings = get_settings(request)
    if site_settings.page_name in ["", None, "None"]:
        site_settings.page_name = "Countries List"
    page_adr = f"{site_settings.theme_name}/countries.html"
    base_adr = f"{site_settings.theme_name}/base.html"
        
    return render(request, page_adr, locals())

@login_required()
def master_country(request, id):
    user_controller = user_control(request)
    if not user_controller['has_perm']:
        return redirect(user_controller['redirect_uri'])
    site_settings = get_settings(request)
    if site_settings.page_name in ["", None, "None"]:
        site_settings.page_name = "Country Details"
    page_adr = f"{site_settings.theme_name}/country.html"
    base_adr = f"{site_settings.theme_name}/base.html"
    
    try:country = Country.objects.get(id=id)
    except: raise Http404
    site_settings.page_name = f"{country.name} details"
    developments = Development.objects.filter(country=country)
    developers = Developer.objects.filter(country=country)
    cities = City.objects.annotate(d_dev=Count('developments')).filter(country=country, d_dev__gt=0)
    available_developments = Development.objects.filter(country=country, is_sold_out=False)
    return render(request, page_adr, locals())


@login_required
def master_country_edit_form(request, id):
    user_controller = user_control(request)
    if not user_controller['has_perm']:
        return redirect(user_controller['redirect_uri'])
    site_settings = get_settings(request)
    if site_settings.page_name in ["", None, "None"]:
        site_settings.page_name = "Edit Country"
    form = None
    try:
        country = Country.objects.get(id=id)
        form = MasterCountryEditForm(instance=country)
        title = f"Edit Country: {country.name}"
    except Exception as e:
        title = "Edit Country"
    modal_id = "MasterEdit"
    btn_footer_value = "Edit"
    form_url = f"/master/countries/{id}/edit/"
    page_adr = f"{site_settings.theme_name}/modal.html"
    base_adr = f"{site_settings.theme_name}/base.html"
    return render(request, page_adr, locals())

@login_required
def master_country_edit(request, id):
    user_controller = user_control(request)
    if not user_controller['has_perm']:
        return redirect(user_controller['redirect_uri'])
    if request.method == 'POST':
        try:
            country = Country.objects.get(id=id)
            form = MasterCountryEditForm(request.POST, instance=country)
            if form.is_valid():
                form.save()
                return JsonResponse({"success": True, "message": "Edit is success.", 'errors': [], 'results':[]})
            else:
                return JsonResponse({"success": False, "message": "error", 'errors': form.errors, 'results':[]})
        except:
            return JsonResponse({"success": False, "message": "not Found", 'errors': [], 'results':[]})

@login_required
def master_countries_list(request):
    # user_controller = user_control(request)
    # if not user_controller['has_perm']:
    #     return JsonResponse({"draw": draw,"recordsTotal": 0,"recordsFiltered": 0,"data": []})
    draw = request.GET.get('draw',1)
    if request.method == 'POST':
        draw = request.POST.get('draw',1)
        start = request.POST.get('start', 0)
        length = request.POST.get('length',10)
        search = request.POST.get('search[value]')
        order_column = request.POST.get('order[0][column]', "0")
        order_dir = request.POST.get('order[0][dir]', "desc")
        order_by = ""
        if order_column: 
            if order_column == "0": order_by = "id"
            elif order_column == "1": order_by = "name"
            elif order_column == "2": order_by = "slug"
            elif order_column == "3": order_by = "code"
            if order_dir == "desc": order_by = f"-{order_by}"
        try: length = int(length)
        except: length = 10
        try: start = int(start)
        except: start = 0

        obj = Country.objects.annotate(d_num=Count('developments')).filter(d_num__gt=0)

        if search is not None:
            obj = obj.filter(Q(name__icontains=search) | Q(slug__icontains=search) | Q(code__icontains=search))

        obj = obj.order_by(order_by)

        serializer = MasterCountrySerializer(obj[start:start+length], many=True)

        result = {
            "draw": draw,
            "recordsTotal": obj.count(),
            "recordsFiltered": obj.count(),
            "data": serializer.data
            }
        return JsonResponse(result)
    draw = request.GET.get('draw',1)
    return JsonResponse({"draw": draw,"recordsTotal": 0,"recordsFiltered": 0,"data": []})

@login_required()
def master_cities(request, c_id=None):
    user_controller = user_control(request)
    if not user_controller['has_perm']:
        return redirect(user_controller['redirect_uri'])
    site_settings = get_settings(request)
    if site_settings.page_name in ["", None, "None"]:
        site_settings.page_name = "Cities List"
    page_adr = f"{site_settings.theme_name}/cities.html"
    base_adr = f"{site_settings.theme_name}/base.html"
    if c_id:
        try:country = Country.objects.get(id=c_id)
        except: raise Http404
    return render(request, page_adr, locals())

@login_required()
def master_city(request, id):
    user_controller = user_control(request)
    if not user_controller['has_perm']:
        return redirect(user_controller['redirect_uri'])
    site_settings = get_settings(request)
    if site_settings.page_name in ["", None, "None"]:
        site_settings.page_name = "City Details"
    page_adr = f"{site_settings.theme_name}/city.html"
    base_adr = f"{site_settings.theme_name}/base.html"
    
    try:city = City.objects.get(id=id)
    except: raise Http404
    site_settings.page_name = f"{city.name} Details"
    developments = Development.objects.filter(city=city)
    developers = Developer.objects.filter(city=city)
    districts = District.objects.filter(city=city)
    available_developments = Development.objects.filter(city=city, is_sold_out=False)
    return render(request, page_adr, locals())

@login_required
def master_city_edit_form(request, id):
    user_controller = user_control(request)
    if not user_controller['has_perm']:
        return redirect(user_controller['redirect_uri'])
    site_settings = get_settings(request)
    if site_settings.page_name in ["", None, "None"]:
        site_settings.page_name = "Edit City"
    form = None
    try:
        city = City.objects.get(id=id)
        form = MasterCityEditForm(instance=city)
        title = f"Edit City: {city.name}"
    except Exception as e:
        title = "Edit City"
    modal_id = "MasterEdit"
    btn_footer_value = "Edit"
    form_url = f"/master/cities/{id}/edit/"
    page_adr = f"{site_settings.theme_name}/modal.html"
    base_adr = f"{site_settings.theme_name}/base.html"
    return render(request, page_adr, locals())

def master_city_edit(request, id):
    user_controller = user_control(request)
    if not user_controller['has_perm']:
        return redirect(user_controller['redirect_uri'])
    if request.method == 'POST':
        try:
            city = City.objects.get(id=id)
            form = MasterCityEditForm(request.POST, instance=city)
            if form.is_valid():
                form.save()
                return JsonResponse({"success": True, "message": "Edit is success.", 'errors': [], 'results':[]})
            else:
                return JsonResponse({"success": False, "message": "error", 'errors': form.errors, 'results':[]})
        except:
            return JsonResponse({"success": False, "message": "not Found", 'errors': [], 'results':[]})

@login_required
def master_cities_list(request, c_id=None):
    # user_controller = user_control(request)
    # if not user_controller['has_perm']:
    #     return JsonResponse({"draw": draw,"recordsTotal": 0,"recordsFiltered": 0,"data": []})
    draw = request.GET.get('draw',1)
    if request.method == 'POST':
        draw = request.POST.get('draw',1)
        start = request.POST.get('start', 0)
        length = request.POST.get('length',10)
        search = request.POST.get('search[value]')
        order_column = request.POST.get('order[0][column]', "0")
        order_dir = request.POST.get('order[0][dir]', "desc")
        order_by = ""
        if order_column: 
            if order_column == "0": order_by = "id"
            elif order_column == "1": order_by = "name"
            elif order_column == "2": order_by = "slug"
            if order_dir == "desc": order_by = f"-{order_by}"
        try: length = int(length)
        except: length = 10
        try: start = int(start)
        except: start = 0

        obj = City.objects.annotate(d_num=Count('developments')).filter(d_num__gt=0)
        if c_id:
            obj = obj.filter(country_id=c_id)
        if search is not None:
            obj = obj.filter(Q(name__icontains=search) | Q(slug__icontains=search) | Q(code__icontains=search))

        obj = obj.order_by(order_by)

        serializer = MasterCitySerializer(obj[start:start+length], many=True)

        result = {
            "draw": draw,
            "recordsTotal": obj.count(),
            "recordsFiltered": obj.count(),
            "data": serializer.data
            }
        return JsonResponse(result)
    draw = request.GET.get('draw',1)
    return JsonResponse({"draw": draw,"recordsTotal": 0,"recordsFiltered": 0,"data": []})

