import 'package:dartz/dartz.dart';
import '../../repositories/company_repository.dart';
import '../../../models/company_model.dart';
import '../../../core/errors/failures.dart';
import '../base_usecase.dart';

/// 회사 생성 파라미터
class CreateCompanyParams {
  final Company company;

  const CreateCompanyParams({
    required this.company,
  });
}

/// 회사 생성 UseCase
class CreateCompanyUseCase extends UseCase<Company, CreateCompanyParams> {
  // 레포지토리 기반으로 마이그레이션
  final CompanyRepository _companyRepository;

  CreateCompanyUseCase(this._companyRepository);

  @override
  Future<Either<Failure, Company>> call(CreateCompanyParams params) async {
    try {
      // 유효성 검증
      final validationResult = _validateCompany(params.company);
      if (validationResult != null) {
        return Left(validationResult);
      }

      final result = await _companyRepository.createCompany(params.company);
      return result;
    } on ServerFailure catch (e) {
      return Left(ServerFailure(
        message: e.message,
        originalError: e,
      ));
    } catch (e) {
      return Left(UnknownFailure(
        message: '회사 생성 중 오류가 발생했습니다.',
        originalError: e,
      ));
    }
  }

  ValidationFailure? _validateCompany(Company company) {
    final errors = <String, String>{};

    if (company.name.isEmpty) {
      errors['name'] = '회사명을 입력해주세요.';
    }

    if (company.address.isEmpty) {
      errors['address'] = '주소를 입력해주세요.';
    }

    if (company.companyTypes.isEmpty) {
      errors['companyTypes'] = '회사 유형을 선택해주세요.';
    }

    if (company.contactEmail != null && company.contactEmail!.isNotEmpty) {
      final emailRegex = RegExp(r'^[a-zA-Z0-9.]+@[a-zA-Z0-9]+\.[a-zA-Z]+');
      if (!emailRegex.hasMatch(company.contactEmail!)) {
        errors['contactEmail'] = '올바른 이메일 형식이 아닙니다.';
      }
    }

    if (company.contactPhone != null && company.contactPhone!.isNotEmpty) {
      final phoneRegex = RegExp(r'^01[0-9]{1}-?[0-9]{4}-?[0-9]{4}$');
      if (!phoneRegex.hasMatch(company.contactPhone!)) {
        errors['contactPhone'] = '올바른 전화번호 형식이 아닙니다.';
      }
    }

    if (errors.isNotEmpty) {
      return ValidationFailure(
        message: '입력값을 확인해주세요.',
        errors: errors,
      );
    }

    return null;
  }
}
