import { Injectable } from '@angular/core';
import exifr from 'exifr';

@Injectable({
  providedIn: 'root'
})
export class ExifService {

  private getExifData(file: File): Promise<any> {
    // console.log('getExifData(file)');
    // return new Promise((resolve, reject) => {
    //   console.log('getExifData(file) -> Promise');
    //   const reader = new FileReader();
    //   console.log('getExifData(file) -> Promise -> reader');
    //   reader.onload = (event: any) => {
    //     console.log('getExifData(file) -> Promise -> reader -> onload');
    //     EXIF.getData(event.target.result, function() {
    //       console.log('getExifData(file) -> Promise -> reader -> onload -> EXIF.getData');
    //       const allExifData = EXIF.getAllTags(this);
    //       console.log('getExifData(file) -> Promise -> reader -> onload -> EXIF.getData -> getAllTags');
    //       resolve(allExifData);
    //     });
    //   };
    //   reader.onerror = (error) => reject(error);
    //   reader.readAsArrayBuffer(file);
    // });
    return exifr.parse(file);
  }

  async getAllExifData(file: File): Promise<any> {
    try {
      return await this.getExifData(file);
    } catch (error) {
      console.error('Error reading EXIF data:', error);
      return
    }
  }

  async getOrientation(file: File): Promise<number | undefined> {
    try {
      const exifData = await this.getExifData(file);
      return exifData.Orientation;
    } catch (error) {
      console.error('Error reading EXIF data:', error);
      return undefined;
    }
  }

  async getDeviceModel(file: File): Promise<string | undefined> {
    try {
      const exifData = await this.getExifData(file);
      return exifData.Model;
    } catch (error) {
      console.error('Error reading EXIF data:', error);
      return undefined;
    }
  }

  async getLocation(file: File): Promise<{ latitude?: number; longitude?: number }> {
    try {
      const exifData = await this.getExifData(file);
      return {
        latitude: exifData.GPSLatitude ? this.convertToDecimal(exifData.GPSLatitude, exifData.GPSLatitudeRef) : undefined,
        longitude: exifData.GPSLongitude ? this.convertToDecimal(exifData.GPSLongitude, exifData.GPSLongitudeRef) : undefined
      };
    } catch (error) {
      console.error('Error reading EXIF data:', error);
      return {};
    }
  }

  async getDateTime(file: File): Promise<string | boolean> {
    try {
      const exifData = await this.getExifData(file);
      return exifData.DateTime;
    } catch (error) {
      console.error('Error reading EXIF data:', error);
      return false;
    }
  }

  private convertToDecimal(coordinate: number[], direction: string): number {
    if (!coordinate || coordinate.length !== 3) return NaN;
    const decimal = coordinate[0] + coordinate[1] / 60 + coordinate[2] / 3600;
    return (direction === 'S' || direction === 'W') ? -decimal : decimal;
  }
}
