import {
    Controller,
    Get,
    Post,
    Body,
    Param,
    Query,
    Delete,
    UnauthorizedException,
} from '@nestjs/common';
import { CompanyService } from './company.service';
import { Company } from './company.entity';

@Controller('companies')
export class CompanyController {
    constructor(private readonly companyService: CompanyService) { }

    // GET /companies/:id -> Retorna uma empresa específica pelo ID
    @Get(':id')
    async findOne(@Param('id') id: number): Promise<Company> {
        return this.companyService.findOne({ id });
    }

    @Post('login')
    async login(
        @Body() loginData: { cnpj: string; senha: string },
    ): Promise<{ message: string; company: Company }> {
        try {
            const company = await this.companyService.authenticate(
                loginData.cnpj,
                loginData.senha,
            );
            return { message: 'Login realizado com sucesso', company };
        } catch (error) {
            throw new UnauthorizedException('CNPJ ou senha inválidos');
        }
    }

    // GET /companies -> Lista empresas com filtro, paginação e ordenação
    @Get()
    async findAll(
        @Query('where') where: any = {},
        @Query('page') page: number = 1,
        @Query('limit') limit: number = 10,
        @Query('orderBy') orderBy: string = 'id',
        @Query('order') order: 'ASC' | 'DESC' = 'ASC',
    ): Promise<{ data: Company[]; total: number }> {
        return this.companyService.findAll(where, page, limit, orderBy, order);
    }

    // POST /companies -> Cria ou atualiza uma empresa
    @Post()
    async upsert(@Body() companyData: Partial<Company>): Promise<Company> {
        return this.companyService.upsert(companyData);
    }

    // DELETE /companies/:id -> Remove uma empresa logicamente
    @Delete(':id')
    async remove(@Param('id') id: number): Promise<void> {
        return this.companyService.remove(id);
    }
}