File size: 1,853 Bytes
bd29ae3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/**
 * Validate image file
 * @param {File} file - File object
 * @returns {Object} - { valid: boolean, error: string }
 */
export const validateImageFile = (file) => {
  const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
  const ALLOWED_TYPES = ['image/jpeg', 'image/png', 'image/jpg', 'image/webp'];

  // Check if file exists
  if (!file) {
    return { valid: false, error: 'No file selected' };
  }

  // Check file type
  if (!ALLOWED_TYPES.includes(file.type)) {
    return {
      valid: false,
      error: `Invalid file type. Allowed: JPG, PNG, WebP. Got: ${file.type}`,
    };
  }

  // Check file size
  if (file.size > MAX_FILE_SIZE) {
    return {
      valid: false,
      error: `File size too large. Max 10MB, got ${(file.size / (1024 * 1024)).toFixed(2)}MB`,
    };
  }

  return { valid: true, error: null };
};

/**
 * Validate multiple files
 * @param {FileList} files - Multiple files
 * @returns {Object} - { valid: boolean, errors: string[] }
 */
export const validateImageFiles = (files) => {
  const errors = [];
  const validFiles = [];

  for (let i = 0; i < files.length; i++) {
    const validation = validateImageFile(files[i]);
    if (!validation.valid) {
      errors.push(`File ${i + 1}: ${validation.error}`);
    } else {
      validFiles.push(files[i]);
    }
  }

  return {
    valid: errors.length === 0,
    errors,
    validFiles,
  };
};

/**
 * Validate vehicle count
 * @param {number} count - Vehicle count
 * @returns {boolean}
 */
export const isValidVehicleCount = (count) => {
  return typeof count === 'number' && count >= 0 && Number.isInteger(count);
};

/**
 * Validate confidence score
 * @param {number} confidence - Confidence score (0-1)
 * @returns {boolean}
 */
export const isValidConfidence = (confidence) => {
  return typeof confidence === 'number' && confidence >= 0 && confidence <= 1;
};