import 'package:dartz/dartz.dart';
import '../../../data/models/equipment_history_dto.dart';
import '../../../core/errors/failures.dart';
import '../base_usecase.dart';
import '../equipment_history_usecase.dart';

/// 장비 이력 조회 파라미터
class GetEquipmentHistoryParams {
  final int equipmentId;
  final DateTime? startDate;
  final DateTime? endDate;
  final String? historyType; // 'in', 'out', 'maintenance', 'disposal'

  const GetEquipmentHistoryParams({
    required this.equipmentId,
    this.startDate,
    this.endDate,
    this.historyType,
  });
}

/// 장비 이력 조회 UseCase (백엔드 스키마 기반)
/// 특정 장비의 입출고 이력 조회
class GetEquipmentHistoryUseCase extends UseCase<List<EquipmentHistoryDto>, GetEquipmentHistoryParams> {
  final EquipmentHistoryUseCase _equipmentHistoryUseCase;

  GetEquipmentHistoryUseCase(this._equipmentHistoryUseCase);

  @override
  Future<Either<Failure, List<EquipmentHistoryDto>>> call(GetEquipmentHistoryParams params) async {
    try {
      // 날짜 유효성 검증
      if (params.startDate != null && params.endDate != null) {
        if (params.startDate!.isAfter(params.endDate!)) {
          return Left(ValidationFailure(
            message: '시작일이 종료일보다 늦을 수 없습니다.',
            errors: {'date': '날짜 범위를 확인해주세요.'},
          ));
        }
      }

      // 이력 타입 유효성 검증
      if (params.historyType != null && 
          !['in', 'out', 'maintenance', 'disposal'].contains(params.historyType)) {
        return Left(ValidationFailure(
          message: '올바르지 않은 이력 타입입니다.',
          errors: {'historyType': '유효한 이력 타입을 선택해주세요.'},
        ));
      }

      final history = await _equipmentHistoryUseCase.getEquipmentHistoriesByEquipmentId(params.equipmentId);
      
      // 필터링 적용
      List<EquipmentHistoryDto> filteredHistory = history;
      
      if (params.historyType != null) {
        filteredHistory = filteredHistory
            .where((h) => h.transactionType == params.historyType)
            .toList();
      }
      
      if (params.startDate != null) {
        filteredHistory = filteredHistory
            .where((h) => h.createdAt.isAfter(params.startDate!))
            .toList();
      }
      
      if (params.endDate != null) {
        filteredHistory = filteredHistory
            .where((h) => h.createdAt.isBefore(params.endDate!))
            .toList();
      }
      
      return Right(filteredHistory);
    } catch (e) {
      if (e.toString().contains('찾을 수 없')) {
        return Left(ValidationFailure(
          message: '장비를 찾을 수 없습니다.',
          code: 'EQUIPMENT_NOT_FOUND',
          originalError: e,
        ));
      } else {
        return Left(ServerFailure(
          message: '장비 이력을 조회하는 중 오류가 발생했습니다.',
          originalError: e,
        ));
      }
    }
  }
}