import { Directory, File, Paths } from "expo-file-system";

const mediaDirectory = new Directory(Paths.document, "workflow-media");
// Cache local des PDF de devis telecharges (devis viewer). Re-telechargeables a
// tout moment depuis l'API -> aucun enjeu de durabilite, on ecrase a chaque vue.
const devisCacheDirectory = new Directory(Paths.document, "devis-cache");

function sanitizeStepId(stepId: string): string {
  return stepId.replaceAll(/[^a-zA-Z0-9_-]/g, "_");
}

async function ensureMediaDir(): Promise<void> {
  if (!mediaDirectory.exists) {
    mediaDirectory.create({ intermediates: true, idempotent: true });
  }
}

export async function savePhotoToPermanentFile(
  interventionId: number,
  stepId: string,
  tempUri: string
): Promise<string> {
  await ensureMediaDir();
  const timestamp = Date.now();
  const name = `photo_${interventionId}_${sanitizeStepId(stepId)}_${timestamp}.jpg`;
  const sourceFile = new File(tempUri);
  const targetFile = new File(mediaDirectory, name);
  sourceFile.copy(targetFile);
  return targetFile.uri;
}

/**
 * M2 — Re-resout l'URI d'un fichier media a partir de son NOM, dans le dossier
 * workflow-media COURANT. Indispensable sur iOS : le conteneur applicatif (GUID
 * dans /var/mobile/Containers/Data/Application/<GUID>/) CHANGE a chaque
 * reinstallation / build natif. Une URI absolue figee en file de sync (ex. une
 * photo enfilee hors-ligne) pointe alors vers un conteneur mort -> l'upload
 * echoue et la photo serait perdue. Le fichier existe pourtant toujours, sous le
 * NOUVEAU conteneur, avec le meme nom.
 *
 * On reconstruit donc le chemin sur `mediaDirectory` (bati a partir de
 * Paths.document, qui pointe sur le conteneur courant). Si le fichier rebase
 * existe, on renvoie son URI ; sinon on renvoie l'URI d'origine (best-effort).
 */
export function resolveMediaFileUri(storedUri: string): string {
  const name = storedUri.split("/").pop() ?? "";
  if (name !== "") {
    const rebased = new File(mediaDirectory, name);
    if (rebased.exists) {
      return rebased.uri;
    }
  }
  return storedUri;
}

/**
 * Devis viewer — ecrit les octets d'un PDF de devis telecharge dans le cache
 * local et renvoie son URI (fichier:// sur le conteneur courant). Le nom est
 * deterministe par devis : une nouvelle consultation ecrase l'ancienne copie
 * (overwrite) plutot que d'accumuler des fichiers. L'octet binaire arrive en
 * Uint8Array (fetch -> arrayBuffer) ; File.write l'ecrit tel quel.
 */
export function saveDevisPdfToCacheFile(devisId: number, bytes: Uint8Array): string {
  if (!devisCacheDirectory.exists) {
    devisCacheDirectory.create({ intermediates: true, idempotent: true });
  }
  const file = new File(devisCacheDirectory, `devis_${devisId}.pdf`);
  file.create({ overwrite: true, intermediates: true });
  file.write(bytes);
  return file.uri;
}

export async function saveSignatureBase64ToPermanentFile(
  interventionId: number,
  stepId: string,
  base64Data: string
): Promise<string> {
  await ensureMediaDir();
  const timestamp = Date.now();
  const name = `signature_${interventionId}_${sanitizeStepId(stepId)}_${timestamp}.png`;
  const targetFile = new File(mediaDirectory, name);
  targetFile.create({ overwrite: true, intermediates: true });
  targetFile.write(base64Data, {
    encoding: "base64",
  });

  return targetFile.uri;
}
