from decimal import Decimal

from django.contrib.auth import get_user_model
from django.test import TestCase
from rest_framework.authtoken.models import Token
from rest_framework.test import APIClient

from accounts.models import ShipperProfile, TransporterProfile, UserRole, Vehicle
from core.models import Bid, Shipment, Trip, TripReview

User = get_user_model()


class TransporterPublicProfileApiTests(TestCase):
    def setUp(self):
        self.shipper = User.objects.create_user('ship-prof@test.com', email='ship-prof@test.com', password='secret')
        UserRole.objects.create(user=self.shipper, role=UserRole.Role.SHIPPER, phone='03000000000', language='en')
        ShipperProfile.objects.create(user=self.shipper, account_type=ShipperProfile.AccountType.INDIVIDUAL)

        self.transporter = User.objects.create_user('tr-prof@test.com', email='tr-prof@test.com', password='secret')
        UserRole.objects.create(user=self.transporter, role=UserRole.Role.TRANSPORTER, phone='03111111111', language='en')
        TransporterProfile.objects.create(
            user=self.transporter,
            account_type=TransporterProfile.AccountType.FLEET_OWNER,
            company_name='Fast Fleet',
            local=True,
            country_to_country=False,
            documents_verified=True,
        )
        self.vehicle = Vehicle.objects.create(
            owner=self.transporter,
            vehicle_type='Flatbed',
            registration_number='REG-100',
            load_capacity=Decimal('4000.00'),
            is_active=True,
            is_verified=True,
        )

        token, _ = Token.objects.get_or_create(user=self.shipper)
        self.client = APIClient()
        self.client.credentials(HTTP_AUTHORIZATION=f'Bearer {token.key}')

    def _create_review(self, rating: int, comment: str):
        shipment = Shipment.objects.create(
            shipper=self.shipper,
            pickup_address='A',
            delivery_address='B',
            cargo_type='General',
            weight='1 ton',
            vehicle_type_required='Flatbed',
            local=True,
            country_to_country=False,
            status=Shipment.Status.COMPLETED,
        )
        bid = Bid.objects.create(
            shipment=shipment,
            transporter=self.transporter,
            amount=Decimal('100.00'),
            status=Bid.Status.ACCEPTED,
        )
        trip = Trip.objects.create(
            shipment=shipment,
            accepted_bid=bid,
            transporter=self.transporter,
            status=Trip.Status.COMPLETED,
        )
        TripReview.objects.create(
            trip=trip,
            shipper=self.shipper,
            transporter=self.transporter,
            driver=self.transporter,
            transporter_rating=rating,
            comment=comment,
        )

    def test_returns_current_vehicle_recent_ratings_and_sum(self):
        self._create_review(5, 'Great job')
        self._create_review(4, 'Good service')

        response = self.client.get(f'/api/shipper/transporters/{self.transporter.id}/profile/')
        self.assertEqual(response.status_code, 200)
        data = response.json()['data']

        self.assertEqual(data['transporter']['id'], self.transporter.id)
        self.assertEqual(data['transporter']['company_name'], 'Fast Fleet')

        self.assertIsNotNone(data['current_vehicle'])
        self.assertEqual(data['current_vehicle']['id'], self.vehicle.id)
        self.assertEqual(data['current_vehicle']['registration_number'], 'REG-100')

        self.assertEqual(data['ratings']['review_count'], 2)
        self.assertEqual(data['ratings']['rating_sum'], 9)
        self.assertEqual(data['ratings']['average_rating'], 4.5)
        self.assertEqual(len(data['ratings']['recent_reviews']), 2)
