"""Current actions avoid late store calls while older action copies remain compatible."""
import os
from pathlib import Path
import subprocess
import tempfile
import unittest

ROOT = Path(__file__).resolve().parents[2]
ACTION = (ROOT / "android-action/action.yml").read_text()
WORKFLOW = (ROOT / "templates/deploy.yml").read_text()


def readiness_step() -> str:
    start = WORKFLOW.index("      - name: Check Google Play API readiness")
    body = WORKFLOW.index("        run: |\n", start) + len("        run: |\n")
    finish = body
    for line in WORKFLOW[body:].splitlines(keepends=True):
        if line.strip() and not line.startswith("          "):
            break
        finish += len(line)
    return WORKFLOW[start:finish]


class EarlyPlayWorkflowTests(unittest.TestCase):
    def run_step(self, readiness: str):
        step = readiness_step().split("        run: |\n", 1)[1]
        script = "\n".join(line[10:] for line in step.splitlines())
        with tempfile.TemporaryDirectory() as tmp:
            root = Path(tmp)
            fake = root / "node"
            fake.write_text('#!/bin/sh\necho called >> "$TRACE"\necho ready=true >> "$GITHUB_OUTPUT"\n')
            fake.chmod(0o700)
            env = {**os.environ, "PATH": f"{root}:{os.environ['PATH']}", "EARLY_READINESS": readiness,
                   "TRACE": str(root / "trace"), "GITHUB_OUTPUT": str(root / "output"),
                   "PACKAGE_NAME": "com.example.app", "SERVICE_ACCOUNT": "fixture.json"}
            result = subprocess.run(["bash", "-e", "-o", "pipefail", "-c", script], env=env,
                                    capture_output=True, text=True, check=False)
            output = (root / "output").read_text() if (root / "output").exists() else ""
            return result, output, (root / "trace").exists()

    def test_resolver_precedes_both_build_systems_and_dependency_failures_stop_it(self):
        resolver = ACTION.index("- name: Resolve Android app and credentials")
        for step in ("Get Flutter dependencies", "Analyze Flutter app", "Test Android app",
                     "Build release Android App Bundle", "Upload Dart symbols to Crashlytics"):
            self.assertLess(resolver, ACTION.index(f"- name: {step}"))
        dependencies = ACTION[ACTION.index("- name: Install Play API dependencies"):resolver]
        self.assertNotIn("|| true", dependencies)
        self.assertIn("value: ${{ steps.config.outputs.play_api_ready }}", ACTION)

    def test_verified_readiness_does_not_make_another_store_request(self):
        result, output, called = self.run_step("true")
        self.assertEqual(result.returncode, 0, result.stderr)
        self.assertEqual(output, "ready=true\n")
        self.assertFalse(called)

    def test_first_release_is_retained_and_false_readiness_only_skips_upload(self):
        result, output, called = self.run_step("false")
        self.assertEqual(result.returncode, 0, result.stderr)
        self.assertEqual(output, "ready=false\n")
        self.assertFalse(called)
        start = WORKFLOW.index("- name: Build and sign Android release")
        end = WORKFLOW.index("- name: Install Google Play preflight dependencies", start)
        self.assertNotIn("ready ==", WORKFLOW[start:end])
        self.assertIn("- name: Retain signed Android App Bundle", WORKFLOW[start:end])
        self.assertIn("steps.play.outputs.ready == 'true'", WORKFLOW)

    def test_older_action_without_new_output_uses_original_cli_contract(self):
        result, output, called = self.run_step("")
        self.assertEqual(result.returncode, 0, result.stderr)
        self.assertEqual(output, "ready=true\n")
        self.assertTrue(called)
        self.assertIn('preflight "$PACKAGE_NAME" "$SERVICE_ACCOUNT"', readiness_step())

    def test_invalid_output_cannot_silently_skip_preflight(self):
        result, output, called = self.run_step("unknown")
        self.assertEqual(result.returncode, 1)
        self.assertEqual(output, "")
        self.assertFalse(called)


if __name__ == "__main__":
    unittest.main()
