package infra

import (
	"os"
	"path/filepath"
	"strings"
	"testing"
)

func TestWriteDockerfile(t *testing.T) {
	t.Run("escribe Dockerfile en directorio existente", func(t *testing.T) {
		tmpDir := t.TempDir()
		content := "FROM alpine:latest\nCMD [\"sh\"]\n"

		path, err := WriteDockerfile(tmpDir, content)
		if err != nil {
			t.Fatalf("unexpected error: %v", err)
		}

		data, err := os.ReadFile(path)
		if err != nil {
			t.Fatalf("cannot read written file: %v", err)
		}
		if string(data) != content {
			t.Errorf("content mismatch: got %q, want %q", string(data), content)
		}
	})

	t.Run("crea directorio si no existe", func(t *testing.T) {
		tmpDir := t.TempDir()
		newDir := filepath.Join(tmpDir, "subdir", "nested")
		content := "FROM scratch\n"

		path, err := WriteDockerfile(newDir, content)
		if err != nil {
			t.Fatalf("unexpected error: %v", err)
		}
		if _, statErr := os.Stat(newDir); os.IsNotExist(statErr) {
			t.Error("expected directory to be created")
		}
		if _, statErr := os.Stat(path); os.IsNotExist(statErr) {
			t.Errorf("expected Dockerfile at %s", path)
		}
	})

	t.Run("retorna path absoluto correcto", func(t *testing.T) {
		tmpDir := t.TempDir()
		content := "FROM ubuntu:22.04\n"

		path, err := WriteDockerfile(tmpDir, content)
		if err != nil {
			t.Fatalf("unexpected error: %v", err)
		}

		if !filepath.IsAbs(path) {
			t.Errorf("expected absolute path, got: %s", path)
		}
		if !strings.HasSuffix(path, "Dockerfile") {
			t.Errorf("expected path to end with Dockerfile, got: %s", path)
		}
	})

	t.Run("error si dir es path invalido", func(t *testing.T) {
		// Intentar escribir en un path donde el padre es un archivo (no directorio)
		tmpDir := t.TempDir()
		// Crear un archivo donde esperamos un directorio
		blockerPath := filepath.Join(tmpDir, "blocker")
		if err := os.WriteFile(blockerPath, []byte("x"), 0o644); err != nil {
			t.Fatal(err)
		}

		// Intentar usar ese archivo como directorio
		_, err := WriteDockerfile(filepath.Join(blockerPath, "subdir"), "FROM scratch\n")
		if err == nil {
			t.Error("expected error when dir path goes through a file, got nil")
		}
	})
}
