from decimal import Decimal

from app.perusahaan.repository import CompanyRepository
from app.perusahaan.schemas import (
    CompanyPpnConfig,
    CompanyProfileResponse,
    CompanyQtyDecimalPlaces,
    CompanyReportProfile,
    CompanySchemaVersion,
)


class CompanyService:
    def __init__(self, repository: CompanyRepository) -> None:
        self.repository = repository

    async def get_company_profile(self) -> CompanyProfileResponse:
        row = await self.repository.get_company_profile()
        if row is None:
            return CompanyProfileResponse()
        return CompanyProfileResponse.model_validate(row)

    async def get_report_profile(self) -> CompanyReportProfile:
        row = await self.repository.get_report_profile()
        if row is None:
            return CompanyReportProfile()
        return CompanyReportProfile.model_validate(row)

    async def get_ppn_config(self) -> CompanyPpnConfig:
        profile = await self.get_company_profile()
        metode = (profile.metode_ppn or "").strip().upper()
        normalized_metode = (
            "TANPA PPN" if metode not in {"INCLUSIVE", "EKSCLUSIVE"} else metode
        )
        value = Decimal(profile.ppn)
        enabled = normalized_metode != "TANPA PPN" and value > 0
        if not enabled:
            value = Decimal("0")
        return CompanyPpnConfig(
            ppn=value,
            metode_ppn=normalized_metode,
            is_ppn_enabled=enabled,
        )

    async def get_qty_decimal_places(self) -> CompanyQtyDecimalPlaces:
        profile = await self.get_company_profile()
        places = max(profile.qty_decimal_places, 0)
        format_string = "0" if places == 0 else f"0.{('0' * places)}"
        return CompanyQtyDecimalPlaces(
            qty_decimal_places=places,
            format_string=format_string,
        )

    async def get_schema_version(self) -> CompanySchemaVersion:
        profile = await self.get_company_profile()
        return CompanySchemaVersion(
            db_schema_version=profile.db_schema_version,
            db_schema_updated_at=profile.db_schema_updated_at,
        )
