import { beforeEach, describe, expect, it, vi } from 'vitest'

vi.mock('../../lib/prisma', () => ({
  prisma: {
    company: { findUniqueOrThrow: vi.fn(), update: vi.fn(), findFirst: vi.fn() },
    brandSettings: { findUnique: vi.fn(), upsert: vi.fn(), findFirst: vi.fn(), updateMany: vi.fn() },
    contractSettings: { findUnique: vi.fn(), upsert: vi.fn() },
    insurancePolicy: { findMany: vi.fn(), create: vi.fn(), updateMany: vi.fn(), findUniqueOrThrow: vi.fn(), deleteMany: vi.fn() },
    pricingRule: { findMany: vi.fn(), create: vi.fn(), updateMany: vi.fn(), findUniqueOrThrow: vi.fn(), deleteMany: vi.fn() },
    accountingSettings: { findUnique: vi.fn(), upsert: vi.fn() },
  },
}))

import { prisma } from '../../lib/prisma'
import * as repo from './company.repo'

describe('company.repo edge queries', () => {
  beforeEach(() => vi.clearAllMocks())

  it('loads a company dashboard envelope with brand, subscription and counts', async () => {
    await repo.findCompany('company_1')

    expect(prisma.company.findUniqueOrThrow).toHaveBeenCalledWith({
      where: { id: 'company_1' },
      include: {
        brand: true,
        subscription: true,
        _count: { select: { vehicles: true, customers: true, reservations: true } },
      },
    })
  })

  it('upserts brand settings with companyId only in the create branch', async () => {
    await repo.upsertBrand('company_1', { logoUrl: '/new.png' }, { primaryColor: '#111111' })

    expect(prisma.brandSettings.upsert).toHaveBeenCalledWith({
      where: { companyId: 'company_1' },
      update: { logoUrl: '/new.png' },
      create: { companyId: 'company_1', primaryColor: '#111111' },
    })
  })

  it('orders insurance policies by required status, sort order and name', async () => {
    await repo.findInsurancePolicies('company_1')

    expect(prisma.insurancePolicy.findMany).toHaveBeenCalledWith({
      where: { companyId: 'company_1' },
      orderBy: [{ isRequired: 'desc' }, { sortOrder: 'asc' }, { name: 'asc' }],
    })
  })

  it('updates and deletes pricing rules inside the tenant boundary', async () => {
    await repo.updatePricingRule('rule_1', 'company_1', { isActive: false })
    await repo.deletePricingRule('rule_1', 'company_1')

    expect(prisma.pricingRule.updateMany).toHaveBeenCalledWith({
      where: { id: 'rule_1', companyId: 'company_1' },
      data: { isActive: false },
    })
    expect(prisma.pricingRule.deleteMany).toHaveBeenCalledWith({ where: { id: 'rule_1', companyId: 'company_1' } })
  })

  it('detects duplicate public branding outside the current company', async () => {
    await repo.findBrandBySubdomain('atlas', 'company_1')
    await repo.findBrandByCustomDomain('cars.example.test', 'company_1')

    expect(prisma.brandSettings.findFirst).toHaveBeenNthCalledWith(1, {
      where: { subdomain: 'atlas', companyId: { not: 'company_1' } },
    })
    expect(prisma.brandSettings.findFirst).toHaveBeenNthCalledWith(2, {
      where: { customDomain: 'cars.example.test', companyId: { not: 'company_1' } },
    })
  })

  it('clears custom domain verification metadata in one tenant-scoped mutation', async () => {
    await repo.clearCustomDomain('company_1')

    expect(prisma.brandSettings.updateMany).toHaveBeenCalledWith({
      where: { companyId: 'company_1' },
      data: { customDomain: null, customDomainVerified: false, customDomainAddedAt: null },
    })
  })
})
