from ares_util.ares import call_ares
from django.contrib.auth.decorators import login_required
from django.http import HttpRequest
from django.http import HttpResponse
from django.shortcuts import redirect
from django.shortcuts import render
from django.urls import reverse

from . import forms
from . import models


def build_address(street: str, zip_code: int | str, city: str, city_part: str) -> str:
    return f'{street}, {zip_code}, {city} - {city_part}'


@login_required
def main_page(req: HttpRequest) -> HttpResponse:
    if req.method == 'POST':
        select_subject_form = forms.SelectSubjectForm(
            data=req.POST, instance=req.user, current_user=req.user,
        )
        if select_subject_form.is_valid():
            select_subject_form.save()
        return redirect(reverse('subjects:list'))

    elif req.method == 'GET':
        subjects = models.Subject.objects.exclude(
            id=req.user.supplier.id if req.user.supplier else None,
        )
        select_subject_form = forms.SelectSubjectForm(
            instance=req.user, current_user=req.user,
        )
        return render(
            req,
            'subjects/index.html',
            dict(subjects=subjects, form=select_subject_form),
        )

    return HttpResponse(status=405)


@login_required
def create_subject(req: HttpRequest) -> HttpResponse:
    if req.method == 'POST':
        form = forms.CreateSubjectForm(data=req.POST)

        if not form.is_valid():
            return render(req, 'subjects/create.html', dict(form=form))

        ares_data = call_ares(form.cleaned_data.get('cin'))

        ares_address_data = ares_data['address']
        ares_legal_data = ares_data['legal']

        subject = models.Subject.objects.create(
            id=ares_legal_data['company_id'], vat_id=ares_legal_data['company_vat_id'],
        )
        models.SubjectData.objects.create(
            subject=subject,
            name=ares_legal_data['company_name'],
            street=ares_address_data['street'],
            zip_code=ares_address_data['zip_code'],
            city=ares_address_data['city'],
            city_part=ares_address_data['city_part'],
        )

        return redirect(reverse('subjects:list'))

    elif req.method == 'GET':
        form = forms.CreateSubjectForm()

        return render(req, 'subjects/create.html', dict(form=form))

    return HttpResponse(status=405)


@login_required
def link_subject(request: HttpRequest, subject_id: int) -> HttpResponse:
    subject = models.Subject.objects.get(pk=subject_id)
    subject.user_set.add(request.user)
    return redirect(reverse('subjects:list'))


@login_required
def unlink_subject(request: HttpRequest, subject_id: int) -> HttpResponse:
    subject = models.Subject.objects.get(pk=subject_id)
    subject.user_set.remove(request.user)
    return redirect(reverse('subjects:list'))