from django.test import TestCase, Client
from django.contrib.auth import get_user_model
from datetime import date

from bazi.models import Person

User = get_user_model()


class BaziGoodDaysAPITests(TestCase):
    def setUp(self):
        self.user = User.objects.create_user(
            phone='0011223344', email='user@example.com', password='pw123456'
        )
        self.client = Client()
        self.client.login(phone='0011223344', password='pw123456')

        # Create an owner person with a known day pillar
        self.person = Person.objects.create(
            name='Owner',
            gender='N',
            birth_date=date(1990, 1, 1),
            owner=True,
            created_by=self.user,
        )
        # Minimal bazi_result indices
        self.person.bazi_result = {
            'year': {'god': 0, 'earth': 0},
            'month': {'god': 0, 'earth': 0},
            'day': {'god': 0, 'earth': 0},
        }
        self.person.save()

        # Another person owned by user (for person_id override)
        self.person2 = Person.objects.create(
            name='Other',
            gender='N',
            birth_date=date(1992, 5, 3),
            owner=False,
            created_by=self.user,
        )
        self.person2.bazi_result = {
            'year': {'god': 2, 'earth': 2},
            'month': {'god': 2, 'earth': 2},
            'day': {'god': 2, 'earth': 2},
        }
        self.person2.save()

        self.url = '/api/bazi/good-days/'

    def test_requires_auth(self):
        self.client.logout()
        resp = self.client.get(self.url)
        self.assertIn(resp.status_code, [401, 403])

    def test_default_current_month(self):
        resp = self.client.get(self.url)
        self.assertEqual(resp.status_code, 200)
        data = resp.json()
        self.assertIn('user', data)
        self.assertIn('days', data)
        self.assertTrue(isinstance(data['days'], list))
        if data['days']:
            d0 = data['days'][0]
            self.assertIn('date', d0)
            self.assertIn('day', d0)
            self.assertIn('month', d0)
            self.assertIn('is_good', d0)
            self.assertIn('reasons', d0)

    def test_custom_range(self):
        resp = self.client.get(self.url, {'start': '2025-01-01', 'end': '2025-01-07'})
        self.assertEqual(resp.status_code, 200)
        data = resp.json()
        self.assertEqual(data['range']['start'], '2025-01-01')
        self.assertEqual(data['range']['end'], '2025-01-07')
        self.assertEqual(len(data['days']), 7)

    def test_person_id_override(self):
        resp = self.client.get(self.url, {'start': '2025-01-01', 'end': '2025-01-02', 'person_id': str(self.person2.id)})
        self.assertEqual(resp.status_code, 200)
        data = resp.json()
        self.assertEqual(data['user']['person_id'], self.person2.id)

    def test_invalid_range(self):
        resp = self.client.get(self.url, {'start': '2025-01-10', 'end': '2025-01-02'})
        self.assertEqual(resp.status_code, 400)
        self.assertIn('error', resp.json())



